iOS导航栏全透明 遇到的UIBarBackground问题

https://www.jianshu.com/p/5d0ed9dae24d

2017.03.30 13:51* 字数 316 阅读 1226评论 1

需要在导航栏做高斯模糊效果,想把navigationBar设置透明,然后在navigationBar后面加个UIVisualEffectView,而不用改动title和左右button及其他VC里面的布局, 结果发现navigationBar总有一层白色的View, 看了下层级发现是个_UIBarBackground类的View,设置backgroundColor也不顶用. 于是将其取出来隐藏了.

整理了下要将导航栏设置透明的两种情况:

  1. 界面从(0,0)开始布局, [navigationBar setTranslucent:YES];
    将navigationBar里的颜色及子view的颜色设置为透明即可,
    1. setBackgroundColor:UIColor.clearColor
    2. setBarTintColor:UIColor.clearColor
    3. setBackgroundImage:[UIImage new] forBarMetrics:UIBarMetricsDefault]
    4. setShadowImage:[UIImage new] size:CGSizeMake(SCREEN_WIDTH, 0.01f)]

  2. 界面从(0,44)开始布局 [navigationBar setTranslucent:NO];
    只进行上述操作不够, 因为系统会加一个frame为(0,0,SCREEN_WIDTH,44)的白色View作为遮挡, 而且在iOS 10版本与iOS 10之前的版本两种情况下,这个view的类还不一样.
    iOS 10 :_UIBarBackground 
    iOS 10之前: _UINavigationBarBackground
    把这个类的view设置hidden即可实现从(0,44)开始布局且导航栏全透明.
    代码:

     [self.navigationBar.subviews enumerateObjectsUsingBlock:^(__kindof UIView * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
     
         if ([obj isKindOfClass:NSClassFromString(@"_UIBarBackground")]||[obj isKindOfClass:NSClassFromString(@"_UINavigationBarBackground")]) {  
     
         obj.hidden = YES;  
         }  
     }];
posted @ 2018-07-05 17:34  sundaysios  阅读(2067)  评论(0编辑  收藏  举报