Swift - 让navigationBar完全显示指定的颜色(防止导航栏背景色出现误差)
作者:hangge | 2018-11-30 08:10
1,问题描述
我们可以使用 navigationBar 的 barTintColor 属性来自定义导航栏的颜色。但设置后会发现,实际显示的颜色与自定义的颜色会有误差。
比如下面我们将导航栏和页面视图背景都设置为橙色,可以发现二者颜色并不一致:
2,问题原因
这是因为默认情况下,在 navigationBar 的上面还覆盖着一个 visualeffectView,它会对导航栏背景进行模糊渲染,从而造成颜色变化。要解决这个问题,有如下两种方法:
3,解决办法一
(1)如果设置了导航栏的背景图片(backgroundImage),那么 barTintColor 就会自动失效,相应的 visualeffectView 也就不再存在,自然也就不会有模糊渲染效果。
(2)下面代码我们将 backgroundImage 设置为纯色图片(图片是通过代码自动生成的):
import UIKit class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() //修改页面背景颜色 self.view.backgroundColor = UIColor.orange //修改导航栏背景图片(使用代码动态生成的纯色图片) let image = createImageWithColor(.orange, frame: CGRect(x: 0, y: 0, width: 1, height: 1)) self.navigationController?.navigationBar.setBackgroundImage(image, for: .default) } //生成一个指定颜色的图片 func createImageWithColor(_ color: UIColor, frame: CGRect) -> UIImage? { // 开始绘图 UIGraphicsBeginImageContext(frame.size) // 获取绘图上下文 let context = UIGraphicsGetCurrentContext() // 设置填充颜色 context?.setFillColor(color.cgColor) // 使用填充颜色填充区域 context?.fill(frame) // 获取绘制的图像 let image = UIGraphicsGetImageFromCurrentImageContext() // 结束绘图 UIGraphicsEndImageContext() return image } }
4,解决办法二
我们也可以直接将导航栏设置为不透明达到同样的效果。注意:这种方式修改后,布局就会从导航栏下面开始了(整个 view 下移 64)。
import UIKit class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() //修改页面背景颜色 self.view.backgroundColor = UIColor.orange //修改导航栏背景颜色 self.navigationController?.navigationBar.barTintColor = UIColor.orange //将背景栏设置为不透明 self.navigationController?.navigationBar.isTranslucent = false } }
全部评论(2)
航哥开源精神大赞
站长回复:哈哈,谢谢你的夸奖。欢迎常来看看,我会持续更新下去的。
刚好做的项目是多色导航条 目前每个导航条都是自己画的 读完这篇文字 这个可以换回封装的统一导航条了
站长回复:加油。