iOS Multiline Label NSLineBreakByTruncatingTail - ios

I have a label with numberOfLines set to 2, lineBreakMode set to NSLineBreakByTruncatingTail. I was expecting that when the text extends beyond two lines, the label will truncate it with ellipses. But what is happening is that although the text is being truncated no ellipses are getting shown.
Why would this be? Thanks.
More details:
Following is the custom class for the UITableViewCell that contains the label (contentLabel) in question. The labels are updated in the loadConversation method.
#interface CPActivityStreamCell ()
#property(nonatomic, weak) CardDeck *cardDeck;
#property(nonatomic, weak) UIImageView *icon;
#end
#implementation CPActivityStreamCell
#synthesize contentLabel, eventLabel, avatarView;
- (void)awakeFromNib {
[super awakeFromNib];
self.backgroundColor = [UIColor clearColor];
// Initialize views
[contentLabel setLineBreakMode:NSLineBreakByTruncatingTail];
[contentLabel setNumberOfLines:2];
[contentLabel setTextAlignment:NSTextAlignmentLeft];
[contentLabel setTextColor:[UIColor colorWithWhite:0.55 alpha:1.0]];
contentLabel.backgroundColor = [UIColor clearColor];
[eventLabel setLineBreakMode:NSLineBreakByTruncatingTail];
[eventLabel setNumberOfLines:1];
[eventLabel setTextAlignment:NSTextAlignmentLeft];
[eventLabel setTextColor:[UIColor colorWithWhite:0.55 alpha:1.0]];
eventLabel.backgroundColor = [UIColor clearColor];
eventLabel.font = [UIFont fontWithName:#"Antonio-Regular" size:12];
// Create the icon view
UIImageView *icon = [[UIImageView alloc] initWithFrame:CGRectMake(20.0, 15.0, 16.0, 16.0)];
[self addSubview:icon];
self.icon = icon;
CardDeck *deck = [[CardDeck alloc] initWithFrame:self.contentView.frame numberOfCards:1];
self.backgroundView = deck;
self.cardDeck = deck;
}
- (void)loadConversation:(CPConversation *)conversation {
[self loadAvatars:conversation.avatarUrls];
self.contentLabel.textColor = [UIColor blackColor];
self.eventLabel.text = [conversation.eventTitle uppercaseString];
self.eventLabel.textColor = [UIColor colorWithWhite:0.55 alpha:1.0];
self.contentLabel.text = conversation.content;
[self loadEventTypeIcon:conversation.eventType white:NO];
[self updateDeck:conversation withFrame:self.contentView.frame];
if ([conversation.typeString isEqualToString:#"image"]) {
[self loadConversationImage:conversation];
}
}
//other methods
#end
The same label in IB:
Output:
The top cell's contentLabel is set to Start of a really long text to test truncation and display in activity stream. It should be truncated with ellipses. End.:

The problem lies somewhere in the architecture of your initialization procedure, or possibly in something you are doing elsewhere (in code you have not shown in your question). You are saying
[contentLabel setLineBreakMode:NSLineBreakByTruncatingTail];
[contentLabel setNumberOfLines:2];
[contentLabel setTextAlignment:NSTextAlignmentLeft];
[contentLabel setTextColor:[UIColor colorWithWhite:0.55 alpha:1.0]];
contentLabel.backgroundColor = [UIColor clearColor];
But this code is not being applied to the label we see in the screen shot. That much is clear, because if it were being applied, the text would be a light gray color.
Thus we may conclude that this code is not running or, if it is running, contentLabel is not hooked up property (perhaps it is nil) and the label is unaffected by it.
Finally, I may point out that on my machine I simply ran your code as given, directly, on a UILabel (not in a table view or anything), and it worked:
[contentLabel setLineBreakMode:NSLineBreakByTruncatingTail];
[contentLabel setNumberOfLines:2];
[contentLabel setTextAlignment:NSTextAlignmentLeft];
[contentLabel setTextColor:[UIColor colorWithWhite:0.55 alpha:1.0]];
contentLabel.backgroundColor = [UIColor clearColor];
contentLabel.text = #"Start of a really long text to test truncation and display in activity stream. It should be truncated with ellipses. End.";
Thus I suggest that either your code is not running or not being applied to the label, or that some other code is coming along and changing the line break mode for this label. It is always best to convince oneself that something works generally for an extremely simple case (like mine, in the preceding code) and then try to figure out why particular results seem to differ from that...

Related

how to make two UILabel side by side in iOS Programatically

I want to show two UILabel side by side programatically as show in the Image below.
As in the Image show the first Label is short value but it value is dyanmic and the second UILabel is more then two line as show in the Image. But the Second Label is set to Right side of the first UILabel.
Is there any way to do this in programatically way..
I try lot of thing to do this but nothing is help to me.
Any help be Appreciated.
try this:
UILabel *label1 = [[UILabel alloc]init];
[self.view addSubview:label1];
label1.backgroundColor = [UIColor greenColor];
label1.font = [UIFont systemFontOfSize:15];
label1.text = #"ABC";
// this is the way
[label1 setContentHuggingPriority:UILayoutPriorityDefaultHigh forAxis:UILayoutConstraintAxisHorizontal];
UILabel *label2 = [[UILabel alloc]init];
[self.view addSubview:label2];
label2.font = [UIFont systemFontOfSize:15];
label2.text = #"label2label2label2label2label2label2label2label2label2label2label2";
label2.backgroundColor = [UIColor orangeColor];
label2.numberOfLines = 0;
[label1 mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(0);
make.top.mas_equalTo(400);
make.height.mas_equalTo(18);
}];
[label2 mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(label1.mas_right);
make.top.mas_equalTo(label1);
make.right.mas_offset(0);
}];

UITextView responding to touches, but keyboard doesn't appear

I can't comprehend it. I have a uitextview which animates upward when it begins editing to make room for the keyboard. I tap the uitextview and registers that it has begun editing and it animates up but the keyboard doesn't appear. This has never happened before and I've tested the app hundreds of times. I even have the textview become first responder upon building the view and the keyboard still doesn't show.
I have the .m file and .h file as so that is not the issue..
Here is the set up code:
self.addDescriptionTextView = [[UITextView alloc] initWithFrame:CGRectMake(0, 470, 320, 100)];
[self.addDescriptionTextView setBackgroundColor:[UIColor colorWith8BitRed:0 green:0 blue:0 alpha:.5]];
[self.addDescriptionTextView setTextColor: [UIColor whiteColor]];
[self.addDescriptionTextView setFont:[UIFont fontWithName:#"Verdana" size:16]];
[self.addDescriptionTextView setDelegate:self];
self.addDescriptionTextView.textContainer.maximumNumberOfLines = 10;
[self.addDescriptionTextView.layoutManager textContainerChangedGeometry:self.addDescriptionTextView.textContainer];
[confirmView addSubview:self.addDescriptionTextView];
I ran your code on my iOS device and the keyboard came up,
Heres the viewDidLoad Code I ran,
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
self.addDescriptionTextView = [[UITextView alloc] initWithFrame:CGRectMake(0, 470, 320, 100)];
self.addDescriptionTextView.backgroundColor = [UIColor redColor];
[self.addDescriptionTextView setTextColor: [UIColor whiteColor]];
[self.addDescriptionTextView setFont:[UIFont fontWithName:#"Verdana" size:16]];
[self.addDescriptionTextView setDelegate:self];
self.addDescriptionTextView.textContainer.maximumNumberOfLines = 10;
[self.addDescriptionTextView.layoutManager textContainerChangedGeometry:self.addDescriptionTextView.textContainer];
self.addDescriptionTextView.editable = YES;
[self.view addSubview:self.addDescriptionTextView];
}
Try adding the UIView.editable line but it should be set to yes automatically.
It might have something to do with confirmView?
Also try changing the UIColor Background colour line I was getting errors with your one.
Edit: After running on iPhone4s your problem is the position you initiate the UIView (to see try changing the 470 to 0 in the CGRect to see the bug)

Back button title missing with long screen title in iOS 7

I am seeing that "Back" button title is missing when my screen title is big. I needed to show the entire title. Is there any workaround to this?
Please see attached the screenshot of navigation bar I see with long title.
Make your screen title smaller. You can take control of it by using a titleView that's a UILabel. The advantage is that you can set its size, and that it can truncate its text and/or make the text occupy two lines if the text is too big (rather than just growing, as the title does).
UIView *iv = [[UIView alloc] initWithFrame:CGRectMake(0,0,170,35)];
[iv setBackgroundColor:[UIColor whiteColor]];
_titleLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 170, 35)];
_titleLabel.textAlignment = UITextAlignmentCenter;
[_titleLabel setFont:[UIFont boldSystemFontOfSize:16.0]];
[_titleLabel setBackgroundColor:[UIColor clearColor]];
[_titleLabel setTextColor:[UIColor blackColor]];
[_titleLabel setText:#""];
_titleLabel.clipsToBounds = false;
iv.clipsToBounds = false;
[iv addSubview:_titleLabel];
[self.navigationItem setTitleView:iv];
also you need
#property (strong, nonatomic) UILabel* titleLabel;

UITableViewStyleGrouped default header view?

I'm trying to implement a control for deleting entire sections, and it would look best in my app if the delete button was in the header, as opposed to an overlay like a UIPopoverView.
In the process of writing this question, I found the answer. Easy enough, once there's a starting point.
I got the bulk of the code from this blog which has only two posts, both from 2010.
Then I went back to this site just for the font color, since it's more trouble to break apart.
Three minor problems, all with the label.
- Font is too narrow
- Text color is too dark
- Label origin is wrong
The default font is known, so that comes first.
label.font = [UIFont boldSystemFontOfSize:17.0];
Color is next, since that's easy. Used an image editor's Eyedropper tool for this.
label.textColor = [UIColor colorWithRed:0.298 green:0.337 blue:0.423 alpha:1];
// Is there a difference between alpha:1 and alpha:1.000?
Then the hard part. A close guess, and then some tweaking for a perfect match.
label.frame = CGRectMake(54, 4, headerView.frame.size.width-20, 22);
And now we have a custom implementation that perfectly matches the current Grouped header.
Finished code:
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
UIView *headerView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, tableView.frame.size.width, 40)];
tableView.sectionHeaderHeight = headerView.frame.size.height;
UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(54, 4, labelSize.width, labelSize.height)];
[label setBackgroundColor:[UIColor clearColor]];
[label setFont:[UIFont boldSystemFontOfSize:17.0]];
[label setShadowColor:[UIColor whiteColor]];
[label setShadowOffset:CGSizeMake(0, 1)];
[label setText:[self tableView:tableView titleForHeaderInSection:section]];
[label setTextColor:[UIColor colorWithRed:0.298 green:0.337 blue:0.423 alpha:1.000]];
[headerView addSubview:label];
return headerView;
}
Found this SO answer after finding the right font/color myself. Oh well.
Edit:
For a title label that allows an effectively unlimited amount of text:
// before label init
NSString *title = [self tableView:tableView titleForHeaderInSection:section];
NSUInteger maxWidth = headerView.frame.size.width-108;
CGSize labelSize = [title sizeWithFont:[UIFont systemFontOfSize:17.0]
constrainedToSize:CGSizeMake(maxWidth, CGFLOAT_MAX)];
if (labelSize.width < maxWidth) labelSize.width = maxWidth;
// after setFont:
[label setNumberOfLines:0];

iPhone Navigation Bar Title text color

It seems the iOS Navigation Bar title color is white by default. Is there a way to change it to a different color?
I am aware of the navigationItem.titleView approach using an image. Since my design skills are limited and I failed to get the standard glossy, I prefer changing the text color.
Any insight would be much appreciated.
Modern approach
The modern way, for the entire navigation controller… do this once, when your navigation controller's root view is loaded.
[self.navigationController.navigationBar setTitleTextAttributes:
#{NSForegroundColorAttributeName:[UIColor yellowColor]}];
However, this doesn't seem have an effect in subsequent views.
Classic approach
The old way, per view controller (these constants are for iOS 6, but if want to do it per view controller on iOS 7 appearance you'll want the same approach but with different constants):
You need to use a UILabel as the titleView of the navigationItem.
The label should:
Have a clear background color (label.backgroundColor = [UIColor clearColor]).
Use bold 20pt system font (label.font = [UIFont boldSystemFontOfSize: 20.0f]).
Have a shadow of black with 50% alpha (label.shadowColor = [UIColor colorWithWhite:0.0 alpha:0.5]).
You'll want to set the text alignment to centered as well (label.textAlignment = NSTextAlignmentCenter (UITextAlignmentCenter for older SDKs).
Set the label text color to be whatever custom color you'd like. You do want a color that doesn't cause the text to blend into shadow, which would be difficult to read.
I worked this out through trial and error, but the values I came up with are ultimately too simple for them not to be what Apple picked. :)
If you want to verify this, drop this code into initWithNibName:bundle: in PageThreeViewController.m of Apple's NavBar sample. This will replace the text with a yellow label. This should be indistinguishable from the original produced by Apple's code, except for the color.
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self)
{
// this will appear as the title in the navigation bar
UILabel *label = [[[UILabel alloc] initWithFrame:CGRectZero] autorelease];
label.backgroundColor = [UIColor clearColor];
label.font = [UIFont boldSystemFontOfSize:20.0];
label.shadowColor = [UIColor colorWithWhite:0.0 alpha:0.5];
label.textAlignment = NSTextAlignmentCenter;
// ^-Use UITextAlignmentCenter for older SDKs.
label.textColor = [UIColor yellowColor]; // change this color
self.navigationItem.titleView = label;
label.text = NSLocalizedString(#"PageThreeTitle", #"");
[label sizeToFit];
}
return self;
}
Edit: Also, read Erik B's answer below. My code shows the effect, but his code offers a simpler way to drop this into place on an existing view controller.
I know this is a pretty old thread, but I think it would be useful to know for new users that iOS 5 brings a new property for establishing title properties.
You can use UINavigationBar's setTitleTextAttributes for setting the font, color, offset, and shadow color.
In addition you can set the same default UINavigationBar's Title Text Attributes for all the UINavigationBars throughout your application.
For example like so:
NSDictionary *navbarTitleTextAttributes = [NSDictionary dictionaryWithObjectsAndKeys:
[UIColor whiteColor],UITextAttributeTextColor,
[UIColor blackColor], UITextAttributeTextShadowColor,
[NSValue valueWithUIOffset:UIOffsetMake(-1, 0)], UITextAttributeTextShadowOffset, nil];
[[UINavigationBar appearance] setTitleTextAttributes:navbarTitleTextAttributes];
In iOS 5 you can change the navigationBar title color in this manner:
navigationController.navigationBar.titleTextAttributes = #{NSForegroundColorAttributeName: [UIColor yellowColor]};
Based on Steven Fisher's answer I wrote this piece of code:
- (void)setTitle:(NSString *)title
{
[super setTitle:title];
UILabel *titleView = (UILabel *)self.navigationItem.titleView;
if (!titleView) {
titleView = [[UILabel alloc] initWithFrame:CGRectZero];
titleView.backgroundColor = [UIColor clearColor];
titleView.font = [UIFont boldSystemFontOfSize:20.0];
titleView.shadowColor = [UIColor colorWithWhite:0.0 alpha:0.5];
titleView.textColor = [UIColor yellowColor]; // Change to desired color
self.navigationItem.titleView = titleView;
[titleView release];
}
titleView.text = title;
[titleView sizeToFit];
}
The advantage of this code, besides dealing with the frame properly, is that if you change the title of your controller the custom title view will also get updated. No need to update it manually.
Another big advantage is that it makes it really simple to enable custom title color. All you need to do is to add this method to the controller.
Most of the above suggestions are deprecated now, for iOS 7 use -
NSDictionary *textAttributes = [NSDictionary dictionaryWithObjectsAndKeys:
[UIColor whiteColor],NSForegroundColorAttributeName,
[UIColor whiteColor],NSBackgroundColorAttributeName,nil];
self.navigationController.navigationBar.titleTextAttributes = textAttributes;
self.title = #"Title of the Page";
Also, checkout the NSAttributedString.h for various text properties that could be set.
In IOS 7 and 8, you can change the Title's color to let's say green
self.navigationController.navigationBar.titleTextAttributes = [NSDictionary dictionaryWithObject:[UIColor greenColor] forKey:NSForegroundColorAttributeName];
To keep the question up-to-date, I'll add Alex R. R. solution, but in Swift:
self.navigationController.navigationBar.barTintColor = .blueColor()
self.navigationController.navigationBar.tintColor = .whiteColor()
self.navigationController.navigationBar.titleTextAttributes = [
NSForegroundColorAttributeName : UIColor.whiteColor()
]
Which results to:
Swift Version
I found most of you guys presented the answers of Objective_C version
I would like to implement this function by using Swift for anyone who needs it.
In ViewDidload
1.To make NavigationBar background becomes color (for example: BLUE)
self.navigationController?.navigationBar.barTintColor = UIColor.blueColor()
2.To make NavigationBar background becomes Image (for example : ABC.png)
let barMetrix = UIBarMetrics(rawValue: 0)!
self.navigationController?.navigationBar
.setBackgroundImage(UIImage(named: "ABC"), forBarMetrics: barMetrix)
3.To change NavigationBar title (for example :[Font:Futura,10] [Color:Red])
navigationController?.navigationBar.titleTextAttributes = [
NSForegroundColorAttributeName : UIColor.redColor(),
NSFontAttributeName : UIFont(name: "Futura", size: 10)!
]
(hint1: don't forget the "!" mark after the UIFont)
(hint2: there are lots of attributes of the title text, command click
the "NSFontAttributeName" you can enter the class and view keyNames
and the Objects types they required)
I hope I can help!:D
Method 1, set it in IB:
Method 2, one line of code:
navigationController?.navigationBar.barTintColor = UIColor.blackColor()
The solution by tewha works well if you are trying to change the color on a page, but I want to be able to change the color on every page. I made some small modifications so that it would work for all pages on a UINavigationController
NavigationDelegate.h
//This will change the color of the navigation bar
#import <Foundation/Foundation.h>
#interface NavigationDelegate : NSObject<UINavigationControllerDelegate> {
}
#end
NavigationDelegate.m
#import "NavigationDelegate.h"
#implementation NavigationDelegate
- (void)navigationController:(UINavigationController *)navigationController
willShowViewController:(UIViewController *)viewController animated:(BOOL)animated{
CGRect frame = CGRectMake(0, 0, 200, 44);//TODO: Can we get the size of the text?
UILabel* label = [[[UILabel alloc] initWithFrame:frame] autorelease];
label.backgroundColor = [UIColor clearColor];
label.font = [UIFont boldSystemFontOfSize:20.0];
label.shadowColor = [UIColor colorWithWhite:0.0 alpha:0.5];
label.textAlignment = UITextAlignmentCenter;
label.textColor = [UIColor yellowColor];
//The two lines below are the only ones that have changed
label.text=viewController.title;
viewController.navigationItem.titleView = label;
}
#end
From iOS 5 onwards we have to set title text color and font of navigation bar using titleTextAttribute Dictionary(predefined dictionary in UInavigation controller class reference).
[[UINavigationBar appearance] setTitleTextAttributes:
[NSDictionary dictionaryWithObjectsAndKeys:
[UIColor blackColor],UITextAttributeTextColor,
[UIFont fontWithName:#"ArialMT" size:16.0], UITextAttributeFont,nil]];
Short and sweet.
[[[self navigationController] navigationBar] setTitleTextAttributes:#{NSForegroundColorAttributeName: [UIColor redColor]}];
Use the code below in any view controller viewDidLoad or viewWillAppear method.
- (void)viewDidLoad
{
[super viewDidLoad];
//I am using UIColor yellowColor for an example but you can use whatever color you like
self.navigationController.navigationBar.titleTextAttributes = #{NSForegroundColorAttributeName: [UIColor yellowColor]};
//change the title here to whatever you like
self.title = #"Home";
// Do any additional setup after loading the view.
}
This is my solution based upon Stevens
Only real difference is I put some handling in for adjust the position if depending on the text length, seems to be similar to how apple do it
UILabel *titleLabel = [[UILabel alloc] initWithFrame:CGRectMake(([self.title length] < 10 ? UITextAlignmentCenter : UITextAlignmentLeft), 0, 480,44)];
titleLabel.backgroundColor = [UIColor clearColor];
titleLabel.font = [UIFont boldSystemFontOfSize: 20.0f];
titleLabel.shadowColor = [UIColor colorWithWhite:0.0 alpha:0.5];
titleLabel.textAlignment = ([self.title length] < 10 ? UITextAlignmentCenter : UITextAlignmentLeft);
titleLabel.textColor = [UIColor redColor];
titleLabel.text = self.title;
self.navigationItem.titleView = titleLabel;
[titleLabel release];
You may want to adjust the 10 value depending on your font size
Swift 4 & 4.2 version:
self.navigationController.navigationBar.titleTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.green]
I ran into the problem with my nav buttons throwing the text out of center (when you only have one button). To fix that I just changed my frame size like so:
CGRect frame = CGRectMake(0, 0, [self.title sizeWithFont:[UIFont boldSystemFontOfSize:20.0]].width, 44);
I've customized the navigationBar's background image and left button item, and the gray title not fit the background. Then I use:
[self.navigationBar setTintColor:[UIColor darkGrayColor]];
to change the tint color to gray. And the title is white now! That's what I want.
Hope to help also :)
It's recommended to set self.title as this is used while pushing child navbars or showing title on tabbars.
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// create and customize title view
self.title = NSLocalizedString(#"My Custom Title", #"");
UILabel *titleLabel = [[UILabel alloc] initWithFrame:CGRectZero];
titleLabel.text = self.title;
titleLabel.font = [UIFont boldSystemFontOfSize:16];
titleLabel.backgroundColor = [UIColor clearColor];
titleLabel.textColor = [UIColor whiteColor];
[titleLabel sizeToFit];
self.navigationItem.titleView = titleLabel;
[titleLabel release];
}
}
This is a pretty old thread but I think of providing answer for setting Color, Size and Vertical Position of Navigation Bar Title for iOS 7 and above
For Color and Size
NSDictionary *titleAttributes =#{
NSFontAttributeName :[UIFont fontWithName:#"Helvetica-Bold" size:14.0],
NSForegroundColorAttributeName : [UIColor whiteColor]
};
For Vertical Position
[[UINavigationBar appearance] setTitleVerticalPositionAdjustment:-10.0 forBarMetrics:UIBarMetricsDefault];
Set Title and assign the attributes dictionary
[[self navigationItem] setTitle:#"CLUBHOUSE"];
self.navigationController.navigationBar.titleTextAttributes = titleAttributes;
This works for me in Swift:
navigationController?.navigationBar.titleTextAttributes = [NSForegroundColorAttributeName:UIColor.white]
self.navigationItem.title=#"Extras";
[self.navigationController.navigationBar setTitleTextAttributes: [NSDictionary dictionaryWithObjectsAndKeys:[UIFont fontWithName:#"HelveticaNeue" size:21], NSFontAttributeName,[UIColor whiteColor],UITextAttributeTextColor,nil]];
Use like this for Orientation support
UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0,0,320,40)];
[view setBackgroundColor:[UIColor clearColor]];
[view setAutoresizingMask:UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight ];
UILabel *nameLabel = [[UILabel alloc] init];
[nameLabel setFrame:CGRectMake(0, 0, 320, 40)];
[nameLabel setBackgroundColor:[UIColor clearColor]];
[nameLabel setAutoresizingMask:UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleBottomMargin |UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleLeftMargin];
[nameLabel setTextColor:[UIColor whiteColor]];
[nameLabel setFont:[UIFont boldSystemFontOfSize:17]];
[nameLabel setText:titleString];
[nameLabel setTextAlignment:UITextAlignmentCenter];
[view addSubview:nameLabel];
[nameLabel release];
self.navigationItem.titleView = view;
[view release];
to set font size of title i have used following conditions.. maybe helpfull to anybody
if ([currentTitle length]>24) msize = 10.0f;
else if ([currentTitle length]>16) msize = 14.0f;
else if ([currentTitle length]>12) msize = 18.0f;
An update to Alex R. R.'s post using the new iOS 7 text attributes and modern objective c for less noise:
NSShadow *titleShadow = [[NSShadow alloc] init];
titleShadow.shadowColor = [UIColor blackColor];
titleShadow.shadowOffset = CGSizeMake(-1, 0);
NSDictionary *navbarTitleTextAttributes = #{NSForegroundColorAttributeName:[UIColor whiteColor],
NSShadowAttributeName:titleShadow};
[[UINavigationBar appearance] setTitleTextAttributes:navbarTitleTextAttributes];
I do believe proper way to set the colour of UINavigationBar is:
NSDictionary *attributes=[NSDictionary dictionaryWithObjectsAndKeys:[UIColor redColor],UITextAttributeTextColor, nil];
self.titleTextAttributes = attributes;
Code above is written is subclass on UINavigationBar, obviously works without subclassing as well.
This is one of those things that are missing. Your best bet is to create your own custom Navigation Bar, add a text box, and manipulate the color that way.
After encountering the same problem (as others) of the label that moves when we insert a button in the navBar (in my case i have a spinner that i replace with a button when the date is loaded), the above solutions didn't work for me, so here is what worked and kept the label at the same place all the time:
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self)
{
// this will appear as the title in the navigation bar
//CGRect frame = CGRectMake(0, 0, [self.title sizeWithFont:[UIFont boldSystemFontOfSize:20.0]].width, 44);
CGRect frame = CGRectMake(0, 0, 180, 44);
UILabel *label = [[[UILabel alloc] initWithFrame:frame] autorelease];
label.backgroundColor = [UIColor clearColor];
label.font = [UIFont boldSystemFontOfSize:20.0];
label.shadowColor = [UIColor colorWithWhite:0.0 alpha:0.5];
label.textAlignment = UITextAlignmentCenter;
label.textColor = [UIColor yellowColor];
self.navigationItem.titleView = label;
label.text = NSLocalizedString(#"Latest Questions", #"");
[label sizeToFit];
}
return self;
You should call [label sizeToFit]; after setting the text to prevent strange offsets when the label is automatically repositioned in the title view when other buttons occupy the nav bar.
Can use this method in appdelegate file and can use at every view
+(UILabel *) navigationTitleLable:(NSString *)title
{
CGRect frame = CGRectMake(0, 0, 165, 44);
UILabel *label = [[[UILabel alloc] initWithFrame:frame] autorelease];
label.backgroundColor = [UIColor clearColor];
label.font = NAVIGATION_TITLE_LABLE_SIZE;
label.shadowColor = [UIColor whiteColor];
label.numberOfLines = 2;
label.lineBreakMode = UILineBreakModeTailTruncation;
label.textAlignment = UITextAlignmentCenter;
[label setShadowOffset:CGSizeMake(0,1)];
label.textColor = [UIColor colorWithRed:51/255.0 green:51/255.0 blue:51/255.0 alpha:1.0];
//label.text = NSLocalizedString(title, #"");
return label;
}
titleTextAttributes
Display attributes for the bar’s title text.
#property(nonatomic, copy) NSDictionary *titleTextAttributes
Discussion
You can specify the font, text color, text shadow color, and text shadow offset for the title in the text attributes dictionary, using the text attribute keys described in NSString UIKit Additions Reference.
Availability
Available in iOS 5.0 and later.
Declared In
UINavigationBar.h

Resources