【问题标题】:UINavigationBar change tint color in CategoryUINavigationBar 更改类别中的色调颜色
【发布时间】:2012-02-16 09:35:55
【问题描述】:

我知道我可以轻松更改 xib 文件中导航栏的色调颜色。但问题是,如果我必须在很多地方进行更改。

因此我尝试使用(花式)类别并覆盖 draw rect 方法。

#import "UINavigationBar+customTint.h"

@implementation UINavigationBar (customTint)

-(void)drawRect:(CGRect)rect{
    self.tintColor = [UIColor redColor];
}

@end

我也在相应的视图控制器中导入了它。我究竟做错了什么? 正确的做法是什么?

提前致谢

【问题讨论】:

标签: iphone ios uinavigationbar


【解决方案1】:

这是一种方法。 ViewController 在您需要更改的地方添加以下行可能会更容易:

self.navigationController.navigationBar.tintColor = [UIColor redColor];

只为一行使用一个类别可能有点过头了。

编辑: 如果您确实想使用类别,您可能需要在导航栏上调用setNeedsDisplay。或覆盖另一个方法并调用它。 有点像,

[self.navigationController.navigationBar setNeedsDisplay];

Also according to Apple's documentation

在 iOS 5 中,UINavigationBar、UIToolbar 和 UITabBar 的实现发生了变化,因此 drawRect: 方法不会被调用,除非它在子类中实现。在这些类中的任何一个类别中重新实现 drawRect: 的应用程序会发现 drawRect: 方法没有被调用。 UIKit 会进行链接检查以防止在 iOS 5 之前链接的应用程序中调用该方法,但在 iOS 5 或更高版本上不支持此设计。 应用可以:

  • 在 iOS 5 及更高版本中使用栏的自定义 API,这是首选方式。
  • 子类 UINavigationBar(或其他栏类)并覆盖子类中的 drawRect:。

因此,解决此问题的最佳方法是将其放在您的ApplicationDidFinishLaunching

NSString *reqSysVer = @"5.0";
NSString *currSysVer = [[UIDevice currentDevice] systemVersion];
if ([currSysVer compare:reqSysVer options:NSNumericSearch] != NSOrderedAscending)
  [[UINavigationBar appearance] setTintColor:myColor];

同时留下你的DrawRect,这样它就可以在低于 5 的 iOS 上运行

【讨论】:

  • 考虑到我必须在 3 个不同的地方进行更改,当一切都完成后,平面设计师要求我进行更改。那我又要换3个地方了。
  • 没关系,你可以把这段代码放在3个不同的地方,或者你想放多少次就放多少次。只需将颜色更改为您想要的颜色即可。
  • 我的问题是如何在一个共同的地方改变它?
  • 请注意,覆盖 drawRect: 可能会影响性能。
  • "那我又要换3个地方了。"一种方法是将所有此类全局内容放在#defines 中,放在您从每个视图控制器文件#import 的单个文件(例如“constants.h”)中,然后您只需在一个地方进行更改。
【解决方案2】:

如果您使用的是 iOS5,那么正确的做法是使用 UIAppearance 代理。

[[UINavigationBar appearance] setTintColor:myColor];

详情请看:https://developer.apple.com/library/ios/#documentation/uikit/reference/UIAppearance_Protocol/Reference/Reference.html

【讨论】:

  • 这只需要一次,会影响所有 UINavigationBars,你可以从 applicationDidFinishLaunching 调用它。
  • 但这仅适用于 iOS 5?以前的 iOS 版本怎么样
  • 与@Amit Shah 的回答相同 - 您必须遍历所有 UINavigationBar。您可以这样做的一种方法是创建一个返回您喜欢的色调颜色的 Singleton,并在初始化 UINavigationBar 时使用它 - 然后当设计师决定他需要多 1% 的红色时,您只需在一次更改它,或者在 Pantone 目录中找到了一个新页面...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-24
  • 1970-01-01
相关资源
最近更新 更多