iOS UINavgationBar全透明一行代码实现/ 任意颜色

释放双眼,带上耳机,听听看~!


线上代码再解释吧

  1. 全透明
     navigationController?.navigationBar.subviews[0].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].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图

人已赞赏
iOS文章

ios系统删除文件

2020-1-1 12:35:44

iOS文章

iOS国际化语言配置

2020-1-1 13:13:06

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
有新消息 消息中心
搜索