UINavigationBar更改类别中的色调颜色

时间:2012-02-16 09:35:55

标签: iphone ios uinavigationbar

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

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

#import "UINavigationBar+customTint.h"

@implementation UINavigationBar (customTint)

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

@end

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

提前谢谢

2 个答案:

答案 0 :(得分:2)

这是一种做法。在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(或其他bar类)并覆盖子类中的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上运行

答案 1 :(得分:2)

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

[[UINavigationBar appearance] setTintColor:myColor];

详细信息:https://developer.apple.com/library/ios/#documentation/uikit/reference/UIAppearance_Protocol/Reference/Reference.html