iOS 11 设置navigationBar透明失效
navigationBar透明实现(iOS 11 之前)
- 设置
navigationBar的BackgroundImage为[UIImage new] - 设置
navigationBar的subviews.firstObject的alpha = 0,subviews.firstObject是_UIbarBackGround类型 ;再或者设置_UIbarBackGround上面模糊的那个 view 的alpha 也可以
iOS 11出现的问题
iOS 11 新出来一个LargeTitles ,导航栏变得比以前更大

1111.png
新的导航栏带来一个问题,之前透过这是 alpha 值来进行透明度设置会失效,原因是在加入 large 模式之后 apple 会对普通模式的 nav 的 _UIbarBackground 进行一次 alpha = 1 的设置。
关于这一点出现的原因我有一个猜想
- 首先设置nav 的 backgroundImage 给 nav 一个背景图
- 然后设置 nav 的 backgroundColor
- 当
prefersLargeTitles = NO也就是 普通 nav 模式的时候,显示backgroundImage - 当
prefersLargeTitles = YES, nav 显示的是backgroundColor - 此时的_UIbarBackGround 的 alpha 被 apple 设置为 0
- 所以相应的在 普通模式的时候 apple 为了显示backgroundImage 会把 nav 的 alpha 设置为 1 ,这就影响了我们在 viewWillAppear 里面给 nav 设置的 alpha
PS:backgroundImage 是在 _UIbarBackGround上面的,backgroundColor设置在navigationBar上
解决办法
iOS 11可以不管 _UIbarBackground 的 alpha,其本身就是透明色,改变其 subview 的 alpha 就好了。(translucent = NO 时 下面的代码放在viewDidAppear里面)
UIView * barBackground = self.navigationController.navigationBar.subviews.firstObject;
if (@available(iOS 11.0, *))
{
barBackground.alpha = 0;
[barBackground.subviews setValue:@(0) forKeyPath:@"alpha"];
} else {
barBackground.alpha = 0;
}
后记
这个问题最开始是在2017年6月初的时候,写一个 nav 相关操作的封装时发现的,当时 iOS 11还处于开发测试阶段,也就没怎么去管。
8月份闲的时候有翻出来看了下,但是没什么好的解决办法,当时是 KVO监控的 alpha 值,发现被系统改了就在改回去,感觉这种方式太过暴利,并且效果也不是特别好,于是就发这个问题到了简书上。
之后因为各种原因很长时间没上简书,也没在关注这个问题(我的几个项目都用不到导航栏透明),直到前几天发现有人关注了我的这篇文章,本着负责(不被吐槽的)态度,我就又研究了下,柳暗花明发现答案很简单
作者:Yang林
链接:https://www.jianshu.com/p/a0b97b6ccd8c
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

浙公网安备 33010602011771号