iPhone导航栏标题文本颜色


283

默认情况下,iOS导航栏标题颜色似乎是白色。有没有办法将其更改为其他颜色?

我知道navigationItem.titleView使用图像的方法。由于我的设计技能有限,并且我无法获得标准的光泽度,因此我更喜欢更改文本颜色。

任何见解将不胜感激。


我只是根据Steven Fisher的回答发布了一段代码,该代码简化了向导航栏中添加自定义彩色标题的过程。它还支持更改标题。寻找它!不会让你失望的。
Erik B

1
埃里克(Erik):我已将关于您答案的注释记入我的信中。我只是用您的代码更新我的答案,但我不想让您投票。聪明的解决办法,顺便说一句。
史蒂芬·费舍尔

Answers:


423

现代方法

对于整个导航控制器,现代的方法是……加载导航控制器的根视图后,只需执行一次。

[self.navigationController.navigationBar setTitleTextAttributes:
   @{NSForegroundColorAttributeName:[UIColor yellowColor]}];

但是,这在后续视图中似乎没有影响。

经典方法

每个视图控制器的旧方法(这些常量适用于iOS 6,但是如果要在iOS 7外观上针对每个视图控制器执行此操作,则需要使用相同的方法,但具有不同的常量):

您需要使用一个UILabel作为titleViewnavigationItem

标签应:

  • 具有清晰的背景色(label.backgroundColor = [UIColor clearColor])。
  • 使用20pt粗体系统字体(label.font = [UIFont boldSystemFontOfSize: 20.0f])。
  • 使用50%alpha(label.shadowColor = [UIColor colorWithWhite:0.0 alpha:0.5])的黑色阴影。
  • 您还需要将文本对齐方式设置为居中(label.textAlignment = NSTextAlignmentCenterUITextAlignmentCenter对于较早的SDK,则为)。

将标签文字颜色设置为您想要的任何自定义颜色。您确实想要一种不会导致文本混合成阴影的颜色,而这将很难阅读。

我通过反复试验得出了结论,但最终得出的价值观对于他们来说太简单了,以至于不是Apple所选择的。:)

如果你想验证这一点,放弃这一代码到initWithNibName:bundle:PageThreeViewController.m苹果的NavBar样品。这将用黄色标签替换文本。除颜色外,这应与Apple代码产生的原始内容没有区别。

- (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;
}

编辑:另外,请阅读以下Erik B的答案。我的代码显示了效果,但是他的代码提供了一种更简单的方法来将其放置在现有视图控制器上。


2
如果使用将标签框设置为其文本大小sizeWithFont:,它将神奇地呈现标准标签的自动对齐行为。
grahamparks 2011年

1
但是,如果您使用sizeToFit,则会丢失自动截断功能。
史蒂芬·费舍尔

3
注:这是旧的方式来设置自定义标题,我建议阅读埃里克B的答案
埃利亚帕尔梅

1
确认sizeToFit有效,因此更新了答案。另外,添加注释以阅读Erik B的答案。
史蒂芬·费舍尔

1
自iOS6.0起,label.textAlignment = UITextAlignmentCenter已被删除,请改用NSTextAlignmentCenter
Jasper

226

我知道这是一个非常老的线程,但是我认为对于新用户来说,iOS 5带来了一个用于建立标题属性的新属性将很有用。

您可以使用UINavigationBar setTitleTextAttributes来设置字体,颜色,偏移量和阴影颜色。

另外,您可以为UINavigationBars整个应用程序设置相同的默认UINavigationBar的“标题文本属性” 。

例如这样:

NSDictionary *navbarTitleTextAttributes = [NSDictionary dictionaryWithObjectsAndKeys:
                                            [UIColor whiteColor],UITextAttributeTextColor, 
                                            [UIColor blackColor], UITextAttributeTextShadowColor, 
                                            [NSValue valueWithUIOffset:UIOffsetMake(-1, 0)], UITextAttributeTextShadowOffset, nil];

[[UINavigationBar appearance] setTitleTextAttributes:navbarTitleTextAttributes];

11
iOS 7中不推荐使用“ UITextAttributeTextColor”。iOS7键为“ NSForegroundColorAttributeName”
Keller

1
请注意,这将更改所有导航栏,这通常是您想要的。
2014年

1
请将此标记为正确答案-可用这些方法不需要上述UILabel方法。
Mic Fok 2014年

180

在iOS 5中,您可以通过以下方式更改navigationBar标题颜色:

navigationController.navigationBar.titleTextAttributes = @{NSForegroundColorAttributeName: [UIColor yellowColor]};

8
@BartSimpson我同意!对于iOS 7,请更新UITextAttributeTextColorNSForegroundColorAttributeName。奇迹般有效!
John Erck 2013年

这项工作!我想了解的是如何?!titleTextAttributes除外,该字典具有“ NSString UIKit附加参考”下提到的“文本属性字典的键”中提到的预定义键集。它如何处理您提到的密钥。
2015年

...并且既然可以使用,我该如何获得“默认”色调?
2015年

设置self.navigationController.navigationBar.tintColor对我不起作用。做到了。
JRam13,2015年

127

基于史蒂芬·费舍尔的回答,我编写了以下代码:

- (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];
}

该代码的优点是,除了正确处理框架之外,如果您更改控制器的标题,则自定义标题视图也将得到更新。无需手动更新。

另一个大优点是,启用自定义标题颜色非常简单。您需要做的就是将此方法添加到控制器中。


3
我同意这绝对是最好的解决方案。无需使用sizeWithFont,我喜欢重写setTitle方法的想法。
埃里亚·帕尔梅

@ Sr.Richie您不应将代码放在自定义导航控制器中。您应该将其放在需要更改标题颜色的所有视图控制器中。您甚至可能根本不需要自定义导航控制器。
Erik B

对我不起作用。我认为这是因为我使用了[UINavigationBar外观]方法..(因为标签titleView始终为nil,所以无效)
Matej

1
如果您使用的是iOS5或更高版本,则应阅读下面的减号。有一个单线可以正常工作,并保留在保留。
algal 2012年

我们需要添加self.title = @“我们的字符串”; 在viewDidLoad.then中,只有上面的代码有效。
Hari1251 2014年

40

上面的大多数建议现在已弃用,供iOS 7使用-

NSDictionary *textAttributes = [NSDictionary dictionaryWithObjectsAndKeys: 
                               [UIColor whiteColor],NSForegroundColorAttributeName, 
                               [UIColor whiteColor],NSBackgroundColorAttributeName,nil];

self.navigationController.navigationBar.titleTextAttributes = textAttributes;
self.title = @"Title of the Page";

另外,检出NSAttributedString.h中可以设置的各种文本属性。


38

在IOS 7和8中,您可以将标题的颜色更改为绿色

self.navigationController.navigationBar.titleTextAttributes = [NSDictionary dictionaryWithObject:[UIColor greenColor] forKey:NSForegroundColorAttributeName];

6
斯威夫特:self.navigationController!.navigationBar.titleTextAttributes = NSDictionary(object: UIColor.whiteColor(), forKey: NSForegroundColorAttributeName) as [NSObject : AnyObject]
拜伦·库茨

更新到Swift 2后,@ ByronCoetsee出现以下错误:无法将类型[[NSObject:AnyObject]]的值分配给类型[[String:AnyObject]?
豪尔赫·卡萨列戈

2
快速2.0更加轻松self.navigationController!.navigationBar.titleTextAttributes = [NSForegroundColorAttributeName: UIColor.whiteColor()]
Kevin DiTraglia 2015年

24

为了使问题保持​​最新,我将添加Alex RR解决方案,但在Swift中

self.navigationController.navigationBar.barTintColor = .blueColor()
self.navigationController.navigationBar.tintColor = .whiteColor()
self.navigationController.navigationBar.titleTextAttributes = [
    NSForegroundColorAttributeName : UIColor.whiteColor()
]

结果是:

在此处输入图片说明


嗯,也许它不适用于Swift 2.0。让我仔细检查一下。虽然没有侵略性。
Michal 2015年

抱歉,Michal,我当时以为是个玩笑!没什么好斗的!对我有用的是这样的:self.navigationController!.navigationBar.titleTextAttributes = NSDictionary(object:UIColor.whiteColor(),forKey:NSForegroundColorAttributeName)as [NSObject:AnyObject]
Radu

添加以下行:UINavigationBar.appearance()。barStyle = UIBarStyle.Black在此行之前:UINavigationBar.appearance()。tintColor = UIColor.whiteColor()使tintColor起作用!
triiiiista

2
在Swift 4.0中:self.navigationController?.navigationBar.titleTextAttributes = [NSAttributedStringKey.foregroundColor:UIColor.white]
Abhi Muktheeswarar,

14

方法1,在IB中进行设置:

在此处输入图片说明

方法2,一行代码:

navigationController?.navigationBar.barTintColor = UIColor.blackColor()

方法2不起作用。titleTextAttributes仅适用于
Vyachaslav Gerchicov,

13

如果您尝试更改页面上的颜色,则tewha的解决方案效果很好,但是我希望能够更改每个页面上的颜色。我做了一些小的修改,以便它的工作在一个页面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

13

从iOS 5开始,我们必须使用titleTextAttribute字典(UInavigation控制器类参考中的预定义字典)设置标题文本的颜色和导航栏的字体。

 [[UINavigationBar appearance] setTitleTextAttributes:
 [NSDictionary dictionaryWithObjectsAndKeys:
  [UIColor blackColor],UITextAttributeTextColor, 
[UIFont fontWithName:@"ArialMT" size:16.0], UITextAttributeFont,nil]];

13

迅捷

我发现你们大多数人都提出了Objective_C版本的答案

我想通过对需要它的任何人使用Swift来实现此功能。

在ViewDidload中

1.使NavigationBar的背景变为彩色(例如:BLUE)

self.navigationController?.navigationBar.barTintColor = UIColor.blueColor()

2.使NavigationBar的背景变为Image(例如:ABC.png)

let barMetrix = UIBarMetrics(rawValue: 0)!

self.navigationController?.navigationBar
      .setBackgroundImage(UIImage(named: "ABC"), forBarMetrics: barMetrix)

3.更改导航栏标题(例如:[字体:Futura,10] [颜色:红色])

navigationController?.navigationBar.titleTextAttributes = [
            NSForegroundColorAttributeName : UIColor.redColor(),
            NSFontAttributeName : UIFont(name: "Futura", size: 10)!
        ]

(提示1:不要忘记UIFont之后的“!”标记)

(提示2:标题文本有很多属性,命令单击“ NSFontAttributeName”,您可以输入类并查看keyNames和所需的Objects类型)

希望我能帮到您!:D


10

在任何视图控制器viewDidLoad或viewWillAppear方法中使用以下代码。

- (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.
}

9

简短而甜美。

[[[self navigationController] navigationBar] setTitleTextAttributes:@{NSForegroundColorAttributeName: [UIColor redColor]}];

8

这是我基于史蒂文斯的解决方案

唯一真正的区别是,如果根据文本长度,我会进行一些调整位置的处理,似乎与苹果的处理方式相似

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];

您可能要根据字体大小调整10值


6

我遇到了导航按钮将文本偏离中心的问题(当您只有一个按钮时)。为了解决这个问题,我只是这样更改了帧大小:

CGRect frame = CGRectMake(0, 0, [self.title sizeWithFont:[UIFont boldSystemFontOfSize:20.0]].width, 44);

6

我自定义了navigationBar的背景图像和左键项目,灰色标题不适合背景。然后我用:

[self.navigationBar setTintColor:[UIColor darkGrayColor]];

将色调颜色更改为灰色。现在标题是白色的!这就是我想要的。

希望也能提供帮助:)


很好,但这仅适用于将文本更改为白色。即使使用[UIColor whiteColor]设置navBar也会将文本颜色更改为白色。
cschuff 2011年

6

建议设置self.title,因为它在推动子导航栏或在标签栏上显示标题时使用。

- (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];
    }
}

6

这是一个很旧的线程,但我想为设置iOS 7及更高版本的导航栏标题的颜色,大小和垂直位置提供答案

颜色和尺寸

 NSDictionary *titleAttributes =@{
                                NSFontAttributeName :[UIFont fontWithName:@"Helvetica-Bold" size:14.0],
                                NSForegroundColorAttributeName : [UIColor whiteColor]
                                };

对于垂直位置

[[UINavigationBar appearance] setTitleVerticalPositionAdjustment:-10.0 forBarMetrics:UIBarMetricsDefault];

设置标题并分配属性字典

[[self navigationItem] setTitle:@"CLUBHOUSE"];
self.navigationController.navigationBar.titleTextAttributes = titleAttributes;

5

这在Swift中对我有用:

navigationController?.navigationBar.titleTextAttributes = [NSForegroundColorAttributeName:UIColor.white]

差不多了,但事情是您的方式将覆盖标题上所有可能的属性。就我而言,那是字体。我最终得到的代码是navigationController?.navigationBar.titleTextAttributes = { if let currentAttributes = navigationController?.navigationBar.titleTextAttributes { var newAttributes = currentAttributes newAttributes[NSForegroundColorAttributeName] = navigationTintColor return newAttributes } else { return [NSForegroundColorAttributeName: navigationTintColor]}}()
Matic Oblak

效果很好。对于Obj-C同样如此:self.navigationController.navigationBar.titleTextAttributes = @{NSForegroundColorAttributeName : UIColor.redColor};
Mike Keskinov


4
self.navigationItem.title=@"Extras";
[self.navigationController.navigationBar setTitleTextAttributes: [NSDictionary dictionaryWithObjectsAndKeys:[UIFont fontWithName:@"HelveticaNeue" size:21], NSFontAttributeName,[UIColor whiteColor],UITextAttributeTextColor,nil]];

3

设置标题的字体大小,我已经使用以下条件..也许对任何人有帮助

if ([currentTitle length]>24) msize = 10.0f;
    else if ([currentTitle length]>16) msize = 14.0f;
    else if ([currentTitle length]>12) msize = 18.0f;

3

使用新的iOS 7文本属性和现代目标c来更新Alex RR的帖子,以减少噪音:

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];

3

我相信设置颜色的正确方法UINavigationBar是:

NSDictionary *attributes=[NSDictionary dictionaryWithObjectsAndKeys:[UIColor redColor],UITextAttributeTextColor, nil];
self.titleTextAttributes = attributes;

上面的代码是在上子类编写的UINavigationBar,显然也无需子类即可工作。


正确,但仅适用于iOS 5。自iOS 5发行以来已经足够长的时间了,这是一个很好的解决方案。而且由于我们在iOS 5世界中,因此值得注意的是,人们可以[UINavigationBar appearance]在那里使用和设置标题文本属性(考虑子类化中的技巧UINavigationBar,这是一种更好的解决方案)。
伊万·武西卡(IvanVučica)2012年

@stringCode。是否可以在没有“ self.navigationController.navigationBar.titleTextAttributes =属性”的情况下初始化以上代码?
Gajendra K Chauhan

3

像这样用于定向支持

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];

2

这是缺少的东西之一。最好的选择是创建自己的自定义导航栏,添加文本框并以这种方式操作颜色。


我遵循您的想法:)我应该重写哪个方法才能开始播放标题?抱歉,我真的是n00b :(
Sr.Richie

2

当我们在navBar中插入按钮时遇到移动标签的相同问题(与其他问题一样)(在我的情况下,我有一个微调器,在加载日期时我将其替换为按钮),上述解决方案不起作用对我来说,这就是将标签始终保持在同一位置的有效方法:

- (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;

1

您应该致电[label sizeToFit];设置文本以防止标签偏移后,当其他按钮占据导航栏时,标签会自动在标题视图中重新定位。


1

可以在appdelegate文件中使用此方法,并且可以在每个视图中使用

+(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;
}

1

titleTextAttributes显示栏标题文本的属性。

@property(非原子,复制)NSDictionary * titleTextAttributes讨论您可以使用NSString UIKit Additions Reference中介绍的文本属性键在文本属性字典中为标题指定字体,文本颜色,文本阴影颜色和文本阴影偏移。

可用性在iOS 5.0和更高版本中可用。在UINavigationBar.h中声明

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.