如何在iOS 7中更改导航栏颜色?


213

如何在iOS 7中更改导航栏颜色?

基本上,我想实现类似Twitter导航栏(已更新Twitter iOS7)的功能。我在顶部嵌入了导航栏view controller。我想要的只是将导航栏的颜色更改为浅蓝色,顶部的实用程序栏也是如此。我似乎找不到自己的选择storyboard



[[UINavigationBar外观] setBarTintColor:[UIColor blackColor]]; 从IOS 7这个WLL工作起
Chandramani

Answers:


319

tintColorfor栏的行为在iOS 7.0中已更改。它不再影响酒吧的背景。

从文档中:

barTintColor 类参考

应用于导航栏背景的色调颜色。

@property(nonatomic, retain) UIColor *barTintColor

讨论
除非您将透明属性设置为,否则默认情况下此颜色为半透明NO

可用性

在iOS 7.0和更高版本中可用。

UINavigationBar.h中声明

NSArray *ver = [[UIDevice currentDevice].systemVersion componentsSeparatedByString:@"."];
if ([[ver objectAtIndex:0] intValue] >= 7) {
    // iOS 7.0 or later   
    self.navigationController.navigationBar.barTintColor = [UIColor redColor];
    self.navigationController.navigationBar.translucent = NO;
}else {
    // iOS 6.1 or earlier
    self.navigationController.navigationBar.tintColor = [UIColor redColor];
}

我们还可以使用它来检查iOS 7 UI过渡指南中提到的iOS版本

if (floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_6_1) {
        // iOS 6.1 or earlier
        self.navigationController.navigationBar.tintColor = [UIColor redColor];
    } else {
        // iOS 7.0 or later     
        self.navigationController.navigationBar.barTintColor = [UIColor redColor];
        self.navigationController.navigationBar.translucent = NO;
    }

使用xib 编辑

在此处输入图片说明


3
但是我可以在哪里放置此代码?我对此很陌生。我将其放置在应用程序委托中,它似乎并没有做太多事情。它建立得很好。
Patricio Guerra

1
内部viewController
Rajneesh071

1
我会把它放在viewController的viewDidLoad中。
HalR 2013年

2
如果(地板(NSFoundationVersionNumber)<= NSFoundationVersionNumber_iOS_6_1)这将是更好的测试,IOS版本你正在运行时,通过转换指南中的苹果公司表示: developer.apple.com/library/ios/documentation/userexperience/...
David Thompson

1
您还可以使用if([self.navigationController.navigationBar responsesToSelector:@selector(setBarTintColor :)])与版本号进行比较,以检查是否可以设置barTintColor
SimpsOff 2013年

129

只需使用Xcode中的Interface Builder,就可以轻松完成原始问题的要求-以获得旧的Twitter导航栏外观,带有白色文本的蓝色背景。

  • 使用文档大纲,选择导航栏。
  • 在“属性”检查器的“导航栏”组中,将“样式”从“默认”更改为“黑色”。这会将“导航”和“状态”栏的背景颜色更改为黑色,并将其文本更改为白色。因此,当应用程序运行时,电池以及状态栏中的其他图标和文本将显示为白色。
  • 在相同的导航栏组中,将“ Bar Tint”更改为您喜欢的颜色。
  • 如果导航栏中有“条形按钮”项,这些项仍将以默认的蓝色显示其文本,因此在“属性”检查器的“视图”组中,将“色调”更改为“白色”。

那应该给您您想要的。这是一个屏幕截图,可以使您更轻松地看到在哪里进行更改。

在哪里进行必要的更改,包括iOS Simulator中的结果

请注意,仅更改Bar Tint不会改变导航栏或状态栏中的文本颜色。样式也需要更改。


不建议为iOS 9选择黑色,任何获得更新答案的机会
Rob85

@ Rob85我现在不在Xcode的前面,但是当Xcode 7(带有iOS 9)发布时,我验证了这些说明仍是最新的。确保选择了导航栏,黑色样式应位于导航栏的属性检查器中。
alondono

2
@ Rob85我已经检查了Apple的Developer网站和样式,Default并且Black在iOS 9中仍然可用。不赞成使用的是BlackOpaqueBlackTranslucent,它们已被Black样式和半透明的复选框所取代。苹果开发者网站上的
UIBarStyle

抱歉@alondono,您绝对正确,我没有在文档大纲中单击“导航控制器”上的导航栏,这就是为什么我看不到它的原因。我看到不推荐使用的黑色是在模拟指标->状态栏上。感谢您的答复
Rob85

@ Rob85酷!谢谢你让我知道。
alondono

76
self.navigationBar.barTintColor = [UIColor blueColor];
self.navigationBar.tintColor = [UIColor whiteColor];
self.navigationBar.translucent = NO;

// *barTintColor* sets the background color
// *tintColor* sets the buttons color

4
我到底可以在哪里放这段代码?对不起,那里的新手问题哈哈
Patricio Guerra

1
可以将代码放置在导航控制器的-(void)viewDidLoad方法中
pNre

2
在iOS 9中,将barTintColor设置为黑色会使时间,设备名称和电池也变为黑色,因此您将看不到它们。为了避免这种情况,请使用self.navigationController.navigationBar.barStyle = UIBarStyleBlack;而不是使用barTintColor;
TheJeff

46

在基于导航的应用程序中,您可以将代码放入AppDelegate中。更详细的代码可能是:

// Navigation bar appearance (background and title)

[[UINavigationBar appearance] setTitleTextAttributes:[NSDictionary dictionaryWithObjectsAndKeys:[UIColor titleColor], NSForegroundColorAttributeName, [UIFont fontWithName:@"FontNAme" size:titleSize], NSFontAttributeName, nil]];

[[UINavigationBar appearance] setTintColor:[UIColor barColor]];

// Navigation bar buttons appearance

[[UIBarButtonItem appearance] setTitleTextAttributes:[NSDictionary dictionaryWithObjectsAndKeys:[UIColor textBarColor], NSForegroundColorAttributeName, shadowColor, NSShadowAttributeName, [UIFont fontWithName:@"FontName" size:titleSize], NSFontAttributeName, nil];

6
[[UINavigationBar appearance] setBarTintColor:[UIColor barColor]];为iOS 7 添加
Samin

24

在中viewDidLoad,设置:

    self.navigationController.navigationBar.barTintColor = [UIColor blueColor];

将(blueColor)更改为您想要的任何颜色。


18

对于快速更改导航栏颜色:

self.navigationController?.navigationBar.barTintColor = UIColor.red

更改标题字体,大小,颜色:

self.title = "title"
self.navigationController?.navigationBar.titleTextAttributes = [
        NSAttributedString.Key.foregroundColor : UIColor.white,
        NSAttributedString.Key.font : UIFont(name: "Futura", size: 30)!
    ]

14

在iOS 7中,您必须使用-barTintColor属性:

navController.navigationBar.barTintColor = [UIColor barColor];

13

如果要使用十六进制代码,这是最好的方法。

首先,在班级顶部定义此代码:

#define UIColorFromRGB(rgbValue) [UIColor colorWithRed:((float)((rgbValue & 0xFF0000) >> 16))/255.0 green:((float)((rgbValue & 0xFF00) >> 8))/255.0 blue:((float)(rgbValue & 0xFF))/255.0 alpha:1.0]

然后在“应用程序didFinishLaunchingWithOptions”内部,输入以下内容:

[[UINavigationBar appearance] setBarTintColor:UIColorFromRGB(0x00b0f0)];

将十六进制代码替换为00b0f0。


1
[UINavigationBar外观]非常有用。
肯(Ken)

11

如果您需要支持ios6和ios7,则可以在UIViewController中使用以下特定的浅蓝色:

- (void)viewDidLoad {
    [super viewDidLoad];
    NSArray *ver = [[UIDevice currentDevice].systemVersion componentsSeparatedByString:@"."];
    if ([[ver objectAtIndex:0] intValue] >= 7) {
        self.navigationController.navigationBar.barTintColor = [UIColor colorWithRed:89/255.0f green:174/255.0f blue:235/255.0f alpha:1.0f];
        self.navigationController.navigationBar.translucent = NO;
    }else{
        self.navigationController.navigationBar.tintColor = [UIColor colorWithRed:89/255.0f green:174/255.0f blue:235/255.0f alpha:1.0f];
    }
}

3
在iOS 7上:-self.navigationController.navigationBar.barTintColor是条形颜色,而-self.navigationController.navigationBar.tintColor是按钮的文本颜色(返回,完成...)。
IgniteCoders 2013年

10

它实际上比我在这里看到的答案容易:

1) Just make sure you select the navigation bar on the Navigation control. 
2) Select the color you want in the bar tint.
3) You have other options too, and/or individually on each view (just play with it).

我希望这对某人有帮助。我不喜欢看到的答案。我喜欢保持代码尽可能整洁。并不是说以编程方式进行操作是错误的,但是那里有像我这样的人……这是给你们的。 更改导航栏的颜色


谢谢,我几个月前在玩耍时进行了更改,不知道该如何更改!
对称

没问题,很高兴我可以帮助别人
pqsk 2014年

我认为这是最直接的答案!Thx
Ispas Claudiu 2015年

没问题。很高兴仍然有帮助
pqsk 2015年

5

为了使Rajneesh071的代码完整,您可能还需要设置导航栏的标题颜色(如果需要,还可以设置字体),因为默认行为已从iOS 6更改为7:

NSArray *ver = [[UIDevice currentDevice].systemVersion componentsSeparatedByString:@"."];
if ([[ver objectAtIndex:0] intValue] >= 7)
{
    self.navigationController.navigationBar.barTintColor = [UIColor blackColor];
    self.navigationController.navigationBar.translucent = NO;
    NSMutableDictionary *textAttributes = [[NSMutableDictionary alloc] initWithDictionary:mainNavController.navigationBar.titleTextAttributes];
    [textAttributes setValue:[UIColor whiteColor] forKey:UITextAttributeTextColor];
    self.navigationController.navigationBar.titleTextAttributes = textAttributes;
}
else
{
    self.navigationController.navigationBar.tintColor = [UIColor blackColor];
}

5

仅在您ViewContorller 您的计算机中添加此代码AppDelegate

if([[[UIDevice currentDevice] systemVersion] floatValue] < 7.0)
{
    //This is For iOS6
    [self.navigationController.navigationBar setTintColor:[UIColor yellowColor]];
}
else
{
    //This is For iOS7
    [self.navigationController.navigationBar setBarTintColor:[UIColor yellowColor]];
}

4
//You could place this code into viewDidLoad
- (void)viewDidLoad
{
    [super viewDidLoad];
    self.navigationController.navigationBar.tintColor = [UIColor redColor];
    //change the nav bar colour
    self.navigationController.view.backgroundColor = [UIColor redColor];
    //change the background colour
    self.navigationController.navigationBar.translucent = NO;
 }   
//Or you can place it into viewDidAppear
- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:(BOOL)animated];
    self.navigationController.navigationBar.tintColor = [UIColor redColor];
    //change the nav bar colour
    self.navigationController.view.backgroundColor = [UIColor redColor];
    //change the background colour
    self.navigationController.navigationBar.translucent = NO;
}

4

在基于导航的应用程序中,您可以更改颜色

NSArray *ver = [[UIDevice currentDevice].systemVersion componentsSeparatedByString:@"."];
if ([[ver objectAtIndex:0] intValue] >= 7) {
    self.navigationController.navigationBar.barTintColor = [UIColor colorWithRed:19.0/255.0 green:86.0/255.0 blue:138.0/255.0 alpha:1];
    self.navigationController.navigationBar.translucent = NO;
} else {
    self.navigationController.navigationBar.tintColor = [UIColor colorWithRed:19.0/255.0 green:86.0/255.0 blue:138.0/255.0 alpha:1];
}

1
在iOS7中更改tintColor属性不再具有更改条形背景颜色的效果。iOS7中的色调颜色仅影响BarButtonItems等的文本颜色。–
Pascal Bayer

4
#define _kisiOS7 ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0)


  if (_kisiOS7)
    {
        [[UINavigationBar appearance] setBarTintColor:[UIcolor redcolor]];
    }
    else
    {
        [[UINavigationBar appearance] setBackgroundColor:[UIcolor blackcolor]];
        [[UINavigationBar appearance] setTintColor:[UIcolor graycolor]];
    }

3

这个问题和这些答案很有帮助。有了它们,我能够navigationBar用白色标题和按钮文字设置所需的深蓝色。

但是我还需要将时钟,载波,信号强度等更改为白色。黑色只是与深蓝色的对比度不足。

我可能忽略了这个解决方案在之前的一个答案,但我可以通过加入这一行到我的最高水平进行改变viewControllerviewDidLoad

[self.navigationController.navigationBar setBarStyle:UIStatusBarStyleLightContent];

UIStatusBarStyleLightContent可以,但是似乎正确的枚举setBarStyle:UIBarStyleBlack
Collin Allen


3

对于颜色:

[[UINavigationBar appearance] setBarTintColor:[UIColor blackColor]];

对于图像

[[UINavigationBar appearance] setBackgroundImage:[UIImage imageNamed:@"navigationBar_320X44.png"] forBarMetrics:UIBarMetricsDefault];
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.