288

默认情况下,iOS 导航栏标题颜色似乎为白色。有没有办法把它改成不同的颜色?

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

任何见解将不胜感激。

4

32 回答 32

424

现代方法

现代方式,对于整个导航控制器……在加载导航控制器的根视图时执行一次。

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

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

经典方法

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

您需要使用 aUILabel作为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:Apple的 NavBar 示例PageThreeViewController.m中。这将用黄色标签替换文本。这应该和苹果的代码产生的原件没有什么区别,除了颜色。

- (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 的回答。我的代码显示了效果,但他的代码提供了一种更简单的方法来将其放到现有视图控制器上。

于 2009-03-07T02:30:29.587 回答
226

我知道这是一个相当古老的线程,但我认为了解 iOS 5 为新用户带来了用于建立标题属性的新属性会很有用。

您可以使用 UINavigationBarsetTitleTextAttributes设置字体、颜色、偏移量和阴影颜色。

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

例如像这样:

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

[[UINavigationBar appearance] setTitleTextAttributes:navbarTitleTextAttributes];
于 2011-10-26T22:16:52.243 回答
180

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

navigationController.navigationBar.titleTextAttributes = @{NSForegroundColorAttributeName: [UIColor yellowColor]};
于 2012-02-26T16:31:30.363 回答
128

根据 Steven Fisher 的回答,我编写了这段代码:

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

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

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

于 2011-05-05T13:52:50.207 回答
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 以了解可以设置的各种文本属性。

于 2013-10-03T12:01:27.363 回答
39

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

self.navigationController.navigationBar.titleTextAttributes = [NSDictionary dictionaryWithObject:[UIColor greenColor] forKey:NSForegroundColorAttributeName];
于 2013-12-19T16:14:33.900 回答
24

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

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

结果:

在此处输入图像描述

于 2015-08-14T13:48:44.387 回答
14

方法一,在IB中设置:

在此处输入图像描述

方法二,一行代码:

navigationController?.navigationBar.barTintColor = UIColor.blackColor()
于 2016-04-08T13:45:43.890 回答
14

斯威夫特版本

我发现你们中的大多数人都给出了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.更改 NavigationBar 标题(例如:[Font:Futura,10] [Color:Red])

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

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

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

希望能帮到你!:D

于 2015-10-09T10:05:29.143 回答
13

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

 [[UINavigationBar appearance] setTitleTextAttributes:
 [NSDictionary dictionaryWithObjectsAndKeys:
  [UIColor blackColor],UITextAttributeTextColor, 
[UIFont fontWithName:@"ArialMT" size:16.0], UITextAttributeFont,nil]];
于 2012-09-11T07:21:50.117 回答
13

如果您尝试更改页面上的颜色,tewha 的解决方案效果很好,但我希望能够更改每个页面上的颜色。我做了一些小的修改,以便它适用UINavigationController

导航委托.h

//This will change the color of the navigation bar
#import <Foundation/Foundation.h>
@interface NavigationDelegate : NSObject<UINavigationControllerDelegate> {
}
@end

导航委托.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
于 2010-09-24T02:56:51.243 回答
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.
}
于 2014-05-19T06:43:09.547 回答
10

短而甜。

[[[self navigationController] navigationBar] setTitleTextAttributes:@{NSForegroundColorAttributeName: [UIColor redColor]}];
于 2013-12-08T02:50:18.700 回答
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 值

于 2010-10-22T14:28:07.290 回答
7

斯威夫特 4 & 4.2 版本:

 self.navigationController.navigationBar.titleTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.green]
于 2018-06-23T08:41:16.750 回答
6

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

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

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

希望也有帮助:)

于 2011-05-27T05:37:00.390 回答
6

我遇到了导航按钮将文本从中心抛出的问题(当您只有一个按钮时)。为了解决这个问题,我刚刚改变了我的帧大小,如下所示:

CGRect frame = CGRectMake(0, 0, [self.title sizeWithFont:[UIFont boldSystemFontOfSize:20.0]].width, 44);
于 2011-01-21T16:07:19.540 回答
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];
    }
}
于 2012-05-24T18:50:31.047 回答
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;
于 2015-06-04T15:05:12.567 回答
5

这在 Swift 中对我有用:

navigationController?.navigationBar.titleTextAttributes = [NSForegroundColorAttributeName:UIColor.white]
于 2017-04-13T02:44:07.160 回答
4

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];
于 2011-01-17T05:28:43.070 回答
4
self.navigationItem.title=@"Extras";
[self.navigationController.navigationBar setTitleTextAttributes: [NSDictionary dictionaryWithObjectsAndKeys:[UIFont fontWithName:@"HelveticaNeue" size:21], NSFontAttributeName,[UIColor whiteColor],UITextAttributeTextColor,nil]];
于 2014-10-30T05:39:06.867 回答
3

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

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

上面的代码是在子类上编写的UINavigationBar,显然也可以在没有子类的情况下工作。

于 2012-07-09T22:04:27.510 回答
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];
于 2013-11-29T22:35:00.477 回答
3

设置标题的字体大小我使用了以下条件..可能对任何人都有帮助

if ([currentTitle length]>24) msize = 10.0f;
    else if ([currentTitle length]>16) msize = 14.0f;
    else if ([currentTitle length]>12) msize = 18.0f;
于 2011-09-15T11:18:05.800 回答
2

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

- (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;
于 2011-04-14T21:23:40.237 回答
2

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

于 2009-03-01T07:11:35.763 回答
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;
}
于 2012-08-20T10:47:36.710 回答
1

你应该调用 [label sizeToFit]; 在设置文本以防止在其他按钮占据导航栏时标签在标题视图中自动重新定位时出现奇怪的偏移。

于 2011-03-16T05:11:30.473 回答
1

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

@property(nonatomic, copy) NSDictionary *titleTextAttributes 讨论 您可以使用 NSString UIKit Additions Reference 中描述的文本属性键指定文本属性字典中标题的字体、文本颜色、文本阴影颜色和文本阴影偏移量。

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

于 2012-10-07T05:51:19.243 回答
0

为了使 Erik B 的出色解决方案在您应用程序的不同 UIVIewCOntrollers 中更有用,我建议为 UIViewController 添加一个类别并在其中声明他的 setTitle:title 方法。像这样,您将在所有视图控制器上更改标题颜色,而无需重复。

不过要注意的一件事是您不需要 [super setTItle:tilte]; 在 Erik 的代码中,您需要在视图控制器中显式调用 self.title = @"my new title" 才能调用此方法

@implementation UIViewController (CustomeTitleColor)

- (void)setTitle:(NSString *)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 blueColor]; // Change to desired color

        self.navigationItem.titleView = titleView;
        [titleView release];
    }
    titleView.text = title;
    [titleView sizeToFit];
}

@结尾

于 2012-12-31T10:48:40.550 回答
0

我正在为 iOS 9 使用下面的代码,它对我来说工作正常。我还为标题使用了阴影颜色。

self.navigationItem.title = @"MY NAV TITLE";
self.navigationController.navigationBar.barTintColor = [UIColor redColor];
self.navigationController.navigationBar.translucent = NO;
NSShadow *shadow = [[NSShadow alloc] init];
shadow.shadowColor = [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.8];
shadow.shadowOffset = CGSizeMake(0, 1);
[self.navigationController.navigationBar setTitleTextAttributes: [NSDictionary dictionaryWithObjectsAndKeys:
                                                       [UIColor colorWithRed:245.0/255.0 green:245.0/255.0 blue:245.0/255.0 alpha:1.0], NSForegroundColorAttributeName,
                                                       shadow, NSShadowAttributeName,
                                                       [UIFont fontWithName:@"HelveticaNeue-Light" size:21.0], NSFontAttributeName, nil]];

愿这对你有所帮助。

谢谢

于 2016-07-12T06:40:45.350 回答