- 全透明
navigationController?.navigationBar.subviews[0].alpha = 0
- 任意颜色
// 背景是某种单一颜色时 self.navigationController!.navigationBar.barTintColor = UIColor.yellow // 支持任意背景 self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default) // 这里的UIImage()写法会设置成全透明 navigationController?.navigationBar.subviews[0].subviews[0].alpha = 0
结合scrollView的didScroll方法就可以实现随着滑动改变颜色的导航栏了。
好了开始瞎逼逼了
原理
UINavigationBar最终显示效果是很多层Views一起起作用,包括模糊滤镜的效果。所以只是把barTintColor改变或者设置背景图片的话,还是会有一层浅色分割线,这是它的子视图导致的。
层级结构如图所示
于是乎,咱就把它们设置成透明不就好了
所以根据层级结构,就有代码
navigationController?.navigationBar.subviews[0].alpha = 0 // 对应 _UIBarBackground 全透明
再网上查的方法基本上都是以下两种的复杂形式
self.navigationController!.navigationBar.barTintColor = UIColor.yellow // 背景是某种单一颜色时
self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default) // 支持任何背景
它们的实现都会有一条浅灰色的分割线,不过大家好像都没有反应这个现象,如果有出现的话可以用下面这句代码来解决
navigationController?.navigationBar.subviews[0].subviews[0].alpha = 0
navigationBar.subviews[0].subviews[0]
对应的是那条分割线
navigationBar.subviews[0].subviews[1]
对应的是背景图