iOS 11 设置navigationBar透明失效

navigationBar透明实现(iOS 11 之前)

  1. 设置 navigationBarBackgroundImage[UIImage new]
  2. 设置navigationBarsubviews.firstObjectalpha = 0subviews.firstObject_UIbarBackGround 类型 ;再或者设置_UIbarBackGround 上面模糊的那个 view 的alpha 也可以

iOS 11出现的问题

iOS 11 新出来一个LargeTitles ,导航栏变得比以前更大

 
1111.png

新的导航栏带来一个问题,之前透过这是 alpha 值来进行透明度设置会失效,原因是在加入 large 模式之后 apple 会对普通模式的 nav 的 _UIbarBackground 进行一次 alpha = 1 的设置。

关于这一点出现的原因我有一个猜想

  1. 首先设置nav 的 backgroundImage 给 nav 一个背景图
  2. 然后设置 nav 的 backgroundColor
  3. prefersLargeTitles = NO 也就是 普通 nav 模式的时候,显示backgroundImage
  4. prefersLargeTitles = YES, nav 显示的是backgroundColor
  5. 此时的_UIbarBackGround 的 alpha 被 apple 设置为 0
  6. 所以相应的在 普通模式的时候 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
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
posted @ 2018-06-13 21:03  sundaysios  阅读(892)  评论(0)    收藏  举报