Objective c iOS 4中的UINavigationBar着色闪烁

Objective c iOS 4中的UINavigationBar着色闪烁,objective-c,ios,uinavigationbar,Objective C,Ios,Uinavigationbar,我正在使用的应用程序有一个自定义nab栏,但支持iOS 4.2-iOS 5,因此我需要在我的应用程序代理中以这种老式方式设置UINavigationBar背景和色调 @implementation UINavigationBar (UINavigationBarCategory) - (void)drawRect:(CGRect)rect { self.tintColor = [UIColor colorWithRed:42.0/255.0

我正在使用的应用程序有一个自定义nab栏,但支持iOS 4.2-iOS 5,因此我需要在我的应用程序代理中以这种老式方式设置UINavigationBar背景和色调

@implementation UINavigationBar (UINavigationBarCategory)

- (void)drawRect:(CGRect)rect {
    self.tintColor = [UIColor colorWithRed:42.0/255.0 
                                     green:164.0/255.0 
                                      blue:182.0/255.0
                                     alpha:1.0];
    UIImage *img  = [UIImage imageNamed:@"navbar_bg.png"];
    [img drawInRect:CGRectMake(0.0, 0.0, 
                               self.frame.size.width, 
                               self.frame.size.height)];
}
@end
这在很大程度上是可行的,但我注意到,当应用程序第一次启动时,uibarbuttonims会闪烁默认的导航栏颜色一秒钟,然后再进行自我校正并更改颜色以匹配导航栏。有趣的是,导航栏本身从一开始就正确地使用了背景图像

为了清楚起见,我在iOS 5设备上使用了用于UINavigationBar的setBackgroundImage,它的工作原理与预期一致,因此flash仅在iOS 4中使用


有人知道为什么会发生这种情况和/或如何解决吗?

如果使用viewDidLoad中引用的代码调用该类,请尝试将其移动到awakeFromNib

条形按钮项的颜色错误?您可以在viewDidLoad:中将其着色颜色手动设置为着色颜色

 navigationBar.rightBarButtonItem.tintColor = [UIColor ...]
如果您使用的是nib文件。否则,您可以在loadView中执行相同的操作:。无论哪种方式,此代码都将作为初始绘制循环的一部分执行,因此您将拥有正确的颜色,而不会出现任何闪烁


另外,为了便于将来参考,在类别中重写方法在技术上是不正确的。(最新版本的Xcode 4.3将向您发出警告)。您应该正确地将UINavigationBar子类化,或者执行“方法swizzling”。但是这相当困难,所以现在不用担心:)

在应用程序生命周期的什么时候调用引用代码的类,它在viewDidLoad中吗?这就是解决方案-只需手动设置加载的第一个视图控制器的导航栏颜色。谢谢。