iOS 4 中的 UINavigationBar 色调颜色闪烁

Posted

技术标签:

【中文标题】iOS 4 中的 UINavigationBar 色调颜色闪烁【英文标题】:UINavigationBar tint color flashing in iOS 4 【发布时间】:2012-02-28 20:34:22 【问题描述】:

我正在开发的应用程序有一个自定义导航栏,但支持 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

这在大多数情况下都有效,但我注意到当应用程序第一次启动时,UIBarButtonItems 会闪烁默认导航栏颜色一秒钟,然后它们会自行更正并更改颜色以匹配导航栏。有趣的是,导航栏本身从一开始就正确使用了背景图像。

需要明确的是,我在 iOS 5 设备上为 UINavigationBar 使用 setBackgroundImage,它按预期工作,因此 Flash 仅在 iOS 4 中。

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

【问题讨论】:

在应用程序生命周期的什么时候调用引用代码的类,它在 viewDidLoad 中吗? 【参考方案1】:

栏按钮项目的颜色错误?您可以在 viewDidLoad: 中手动设置它们的 tint color 为 tint color

 navigationBar.rightBarButtonItem.tintColor = [UIColor ...]

如果您使用的是 nib 文件。否则你可以在 loadView: 中做同样的事情。无论哪种方式,此代码都将作为初始绘制循环的一部分执行,因此您将获得正确的颜色而不会闪烁。

为了将来参考,在一个类别中覆盖一个方法在技术上是不正确的。 (最新版本的 Xcode 4.3 会给你一个警告)。您应该正确地继承 UINavigationBar 或执行“方法调配”。但这很困难,所以现在不要担心:)

【讨论】:

这最终成为了解决方案 - 只需手动设置加载的第一个视图控制器的导航栏色调颜色。非常感谢。【参考方案2】:

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

【讨论】:

以上是关于iOS 4 中的 UINavigationBar 色调颜色闪烁的主要内容,如果未能解决你的问题,请参考以下文章

UINavigationBar中的分段控件奇怪的截图iOS

IOS7 中的 UINavigationBar/状态栏问题

iOS 8 中 UITableViewController 中的透明 UINavigationBar

推送的 ViewController 中的 iOS 11 UINavigationBar 透明度

为 uinavigationbar 添加颜色

如何调整 UINavigationBar tintColor 以补偿 iOS6 中的新渐变效果?