func setGradientBackgroundColors() {
let gradient = CAGradientLayer()
gradient.startPoint = CGPoint(x:0,y:0.8)
gradient.endPoint = CGPoint(x:1,y:0.1)
gradient.locations = [0,1]
gradient.frame = CGRect(x:0,y:0,width:kScreenW,height:self.navigationBar.bounds.height+kStatusBarH)
gradient.colors = naviBackgroundCGColors
self.navigationBar.layer.addSublayer(gradient)
}
//经过一段时间使用发现,这种写法有问题,当你在NavigationController的某一个childViewController设置self.navigationController.navigationBar.hidden = YES; 即某一个VC中需要隐藏导航栏(我这边是rootViewController需要隐藏),在其他子控制器(未隐藏)设置 self.navigationItem 的 title 或titleView 会出现不显示的问题
解决方案:
通过查看图层可以获悉设置背景色的视图类名为 _UIBarBackground 因此,可以不必在navBar中插入子图层 (subLayer) (这也是出现这个bug的原因所在) ,将渐变图层加入到 _UIBarBackground 中,代码如下:
for sub in self.navigationBar.subviews{
if sub.isKind(of:(NSClassFromString("_UIBarBackground").self)!){
sub.layer.addSublayer(gradient)
}