声明:html
在iOS开发中每一个页面都有可能被个性化设计,但若是页面是以push方式进行管理,那么多个视图控制器共享一个导航栏,导航栏的适配显示就是一个问题。所以需基于系统导航进一步调整和修改才能知足需求。本文参考下面两篇博客进行分析梳理。swift
页面样式自定义(包括隐藏或显示导航栏)以后,关注点以下:segmentfault
导航栏透明iphone
self.navigationBar.isTranslucent = true //须要开启半透明 self.navigationBar.setBackgroundImage(UIImage(), for: .default) self.navigationBar.shadowImage = UIImage()
导航栏隐藏ide
// 导航栏显示(含animated,不然页面有无导航切换可能会突变,在手势pop时最明显) self.navigationController?.setNavigationBarHidden(true, animated: true)
导航栏颜色布局
导航栏半透明开启:既然开启半透明通常是想用模糊效果的,所以明显应使用下列第①种:学习
// ① 半透明开启,此种方式设置颜色有明显模糊效果,展开图层树UINavigatuionBar -> background视图 -> UIVisualEffectView -> UIVisualEffectBackdropView, 发现进行UIVisualEffectBackdropView颜色变化(箭头表明内部子视图),可是由于UIVisualEffectView是模糊控制视图,所以会有模糊效果显现出来 self.navigationController?.navigationBar.backgroundColor = UIColor.kcRed // ② 半透明开启,此种方式设置颜色没有模糊效果,展开图层树UINavigationBar ->background视图 -> imageView, 发现imageView颜色变化(箭头表明内部子视图) self.navigationController?.navigationBar.setBackgroundImage(UIImage(color:UIColor.kcRed), for: .default) // ③ 半透明开启,此种方式设置颜色有轻微模糊感,但不如第一种那样明显,展开图层树UINavigatuionBar -> background视图 -> UIVisualEffectView -> _UIVisualEffectSubview,发现_UIVisualEffectSubview颜色变化(箭头表明内部子视图),由于UIVisualEffectView视模糊控制视图,所以会有模糊效果显现出来 self.navigationController?.navigationBar.barTintColor = UIColor.kcRed
导航栏半透明关闭:建议采用第②种动画
// ① 半透明关闭,此种方式不能设置导航栏背景颜色,展开图层树发现设置backgroundcolor仅仅影响UINavigationBar的颜色,可是UINavigationBar有一个background子视图(默认白色)遮盖了设置的颜色 self.navigationController?.navigationBar.backgroundColor = UIColor.kcRed // ② 半透明关闭,此种方式能够设置导航栏颜色,展开图层树UINavigationBar ->background视图 -> imageView,发现imageView颜色变化(箭头表明内部子视图) self.navigationController?.navigationBar.setBackgroundImage(UIImage(color:UIColor.kcRed), for: .default) // ③ 半透明关闭,此种方式能够设置导航栏颜色。展开图层树发现是设置UINavigationBar的子视图background的颜色,但根据API语义(barTintColor)明显不是设置背景专属,可能会影响内部子视图颜色,所以通常不建议采用此种方法来设置背景色 self.navigationController?.navigationBar.barTintColor = UIColor.kcRed
隐藏导航栏下线ui
// 展开图层树发现黑线是一个高度为0.33的imageView(iphoneX显示),图层树UINavigationBar ->background视图 -> imageView,颜色为透明度0.3的黑色, self.navigationBar.shadowImage = UIImage()
方案一编码
方案二
方案三
方案四
方案五