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

Posted

技术标签:

【中文标题】如何调整 UINavigationBar tintColor 以补偿 iOS6 中的新渐变效果?【英文标题】:How can I adjust UINavigationBar tintColor to compensate for the new gradient effect in iOS6? 【发布时间】:2012-09-20 19:43:57 【问题描述】:

在我的应用中,我将导航栏设置为深蓝色。 ios6 中新的渐变效果使导航栏看起来更亮(见下文)。

如果我将颜色调整为更暗以补偿 iOS6,在 iOS5 中会显得太暗。

使它们看起来相同(或几乎相同)的最佳方法是什么?

检测操作系统版本并设置不同的色调?使用背景图片?或者有没有可以用来改变渐变行为的样式设置?

【问题讨论】:

如果您想在默认启动图像中包含导航栏,这也是一个问题。不管有没有着色,它都不会在旧操作系统上匹配。 【参考方案1】:

实现此目的的一种方法是使用背景图像并使用 iOS 5.0 中引入的外观代理进行设置。

如果您创建一个垂直薄切片的图像(例如,宽度为 1 像素,高度为 44 像素以及加倍的视网膜图像)并将其添加到您的包中,那么您可以为所有导航设置导航栏背景图像使用以下方法在您的应用中显示一次:

[[UINavigationBar appearance] setBackgroundImage:[UIImage imageNamed:@"navigationBarImage"] forBarMetrics:UIBarMetricsDefault]; 

如果您在应用启动时运行该行代码,例如在您的 appDelegate 的以下方法中

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

然后,您应用程序中的每个导航栏看起来都相同。使用这样的图像的好处是,无论操作系统版本如何,以及将来可能会或可能不会发生任何更改,您的应用程序看起来总是一样的。

请注意,外观代理 API 仅在 iOS 5.0 中添加,因此不适用于旧版本的 iOS。要真正了解外观代理,我建议您观看 WWDC 2011 视频 Session 114。

【讨论】:

感谢您的详细解答。背景图像可能是保持完全相同外观的最佳方式。我只是惊讶于 tintColor 外观发生了如此巨大的变化。我想也许我错过了什么。我最终只是采取了简单的方法,并稍微重新设计了 UI,使其适用于两个版本。【参考方案2】:

我也遇到了这个问题,通过去掉色调来解决它,而不是这样做:

navigationController.navigationBar.barStyle = UIBarStyleBlackTranslucent;
navigationController.navigationBar.backgroundColor = [UIColor blackColor];

请注意,这意味着您必须更改您的用户界面/xib 文件,因为您将样式更改为黑色半透明 - 我不得不将所有内容降低 44 点。

现在导航栏在 iOS 5 和 iOS 6 中应该是一样的。

【讨论】:

以上是关于如何调整 UINavigationBar tintColor 以补偿 iOS6 中的新渐变效果?的主要内容,如果未能解决你的问题,请参考以下文章

如何防止在横向上自动调整 UINavigationBar 的大小

IOS 8.3 UIPopoverController tint 中的任何 UISegmentedControl 都是白色且不可调整

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

在 iOS 7 中使用 Tint Color 显示导航栏时白色状态栏消失

如何隐藏 UINavigationBar 和 UITabBar 动画?

旋转到横向时自动调整 UINavigationBar 的大小