在 iOS 7 后,导航栏增加了 translucent 效果,这使得导航栏背景色的变化出现了两种情况:
1.translucent 属性值为 YES 的前提下,更改导航栏的背景色。
2.translucent 属性值为 NO 的前提下,更改导航栏的背景色。
对于第一种情况,我们需要调用 UINavigationBar 的 setBackgroundColor:
方法。
这种方法显示的是渐变模糊效果的图片,没找到原因,推荐使用第二种
对于第二种情况我们需要调用 UINavigationBar 的 setBackgroundImage:forBarMetrics:
方法。
[self.navigationController.navigationBar setBackgroundImage:[self imageWithColor:UIColor.blueColor] forBarMetrics:UIBarMetricsCompactPrompt];
根据颜色生成图片
// 根据颜色生成UIImage
- (UIImage*)imageWithColor:(UIColor*)color{
CGRect rect = CGRectMake(0.0f, 0.0f, 1.0f, 1.0f);
// 开始画图的上下文
UIGraphicsBeginImageContext(rect.size);
// 设置背景颜色
[color set];
// 设置填充区域
UIRectFill(CGRectMake(0, 0, rect.size.width, rect.size.height));
// 返回UIImage
UIImage* image = UIGraphicsGetImageFromCurrentImageContext();
// 结束上下文
UIGraphicsEndImageContext();
return image;
}
对于第二种情况,这里有三点需要提示:
1.在设置透明效果时,我们通常可以直接设置一个 [UIImage new]
创建的对象,无须创建一个颜色为透明色的图片。
2.在使用 setBackgroundImage:forBarMetrics:
方法的过程中,如果图像里存在 alpha 值小于 1.0 的像素点,则 translucent 的值为 YES,反之为 NO。也就是说,如果我们真的想让导航栏变成纯色且没有 translucent 效果,请保证所有像素点的 alpha 值等于 1。
3.如果设置了一个完全不透明的图片且强行将 NavigationBar 的 translucent 属性设置为 YES 的话,系统会自动修正这个图片并为它添加一个透明度,用于模拟 translucent 效果。
4.如果我们使用了一个带有透明效果的图片且导航栏的 translucent 效果为 NO 的话,那么系统会在这个带有透明效果的图片背后,添加一个不透明的纯色图片用于整体效果的合成。这个纯色图片的颜色取决于 barStyle 属性,当属性为 UIBarStyleBlack 时为黑色,当属性为 UIBarStyleDefault 时为白色,如果我们设置了 barTintColor,则以设置的颜色为基准。