iPhone导航栏标题文字颜色

时间:2009-03-01 06:51:02

标签: ios uinavigationbar navigationitem

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

我知道使用图像的navigationItem.titleView方法。由于我的设计技巧有限,而且我没有获得标准光面,我更喜欢更改文字颜色。

非常感谢任何见解。

32 个答案:

答案 0 :(得分:421)

现代方法

现代的方式,对于整个导航控制器......当你的导航控制器的根视图被加载时,这样做一次。

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

但是,这似乎在后续视图中没有效果。

经典方法

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

您需要使用UILabel作为titleView的{​​{1}}。

标签应该:

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

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

我通过反复试验解决了这个问题,但我想出的价值最终太简单了,以至于他们不能成为苹果选择的。 :)

如果您想验证这一点,请将此代码放入UITextAlignmentCenter initWithNibName:bundle: 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; } 。这将用黄色标签替换文本。除了颜色之外,这应该与Apple代码生成的原始版本无法区分。

{{1}}

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

答案 1 :(得分: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];

答案 2 :(得分:180)

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

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

答案 3 :(得分:127)

根据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];
}

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

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

答案 4 :(得分: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以获取可以设置的各种文本属性。

答案 5 :(得分:38)

在IOS 7和8中,您可以更改标题的颜色,让我们说绿色

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

答案 6 :(得分:22)

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

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

结果是:

enter image description here

答案 7 :(得分:14)

方法1 ,在IB中设置:

enter image description here

方法2 ,一行代码:

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

答案 8 :(得分:13)

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

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

答案 9 :(得分: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

答案 10 :(得分:10)

Swift 版本

我发现大多数人都提出了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标题(例如:[字体:Futura,10] [颜色:红色])

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

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

     

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

我希望我能提供帮助!:D

答案 11 :(得分: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.
}

答案 12 :(得分:9)

简短又甜蜜。

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

答案 13 :(得分:8)

这是我基于Stevens的解决方案

唯一真正的不同之处在于我根据文字长度调整了位置,似乎与苹果的做法类似

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值

答案 14 :(得分:6)

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

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

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

希望也能提供帮助:)

答案 15 :(得分:6)

建议设置self.title,因为在推送子导航栏或在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];
    }
}

答案 16 :(得分: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;

答案 17 :(得分:6)

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

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

答案 18 :(得分:5)

这适用于Swift:

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

答案 19 :(得分:3)

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

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

答案 20 :(得分: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];

答案 21 :(得分:3)

使用新的iOS 7文本属性和现代物镜c更新Alex R. R.的帖子以减少噪音:

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

答案 22 :(得分:2)

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

答案 23 :(得分:2)

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

答案 24 :(得分:2)

我确实认为设置UINavigationBar颜色的正确方法是:

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

上面的代码是UINavigationBar上的子类,显然无需子类化。

答案 25 :(得分: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;

答案 26 :(得分:2)

Swift 4版本:

self.navigationController.navigationBar.titleTextAttributes = [
        NSAttributedStringKey.foregroundColor: UIColor.green]

答案 27 :(得分:1)

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

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

状况 适用于iOS 5.0及更高版本。 宣告进入 UINavigationBar.h

答案 28 :(得分: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;
}

答案 29 :(得分:1)

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

答案 30 :(得分:0)

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

有一点需要注意的是,你不需要[super setTItle:tilte];在Erik的代码中,您需要在视图控制器中显式调用self.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];
}

@end

答案 31 :(得分: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]];

愿这对你有所帮助。

由于