作者归档 guhuangwudi@gmail.com

通过guhuangwudi@gmail.com

UINavgationBar全透明一行代码实现/ 任意颜色(转)

  1. 全透明
     navigationController?.navigationBar.subviews[0].alpha = 0
  2. 任意颜色
     // 背景是某种单一颜色时
     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改变或者设置背景图片的话,还是会有一层浅色分割线,这是它的子视图导致的。

层级结构如图所示

背景下面有两个ImageView

一个是大的,另外一个就是分割线了

于是乎,咱就把它们设置成透明不就好了
所以根据层级结构,就有代码

  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]对应的是背景图

效果对比dd图