美文网首页
ios NavigationBar 导航栏半透明灰色

ios NavigationBar 导航栏半透明灰色

作者: 114105lijia | 来源:发表于2019-12-04 09:30 被阅读0次

    有时候我们会遇到需要隐藏导航栏的需求.
    我们一般的解决办法是在viewWillAppear中隐藏导航栏,在viewWillDisappear显示导航栏,这样来达到隐藏导航栏的效果。

    - (void)viewWillAppear:(BOOL)animated {
        [super viewWillAppear:animated];
        self.navigationController.navigationBarHidden = YES;
    }
    
    - (void)viewWillDisappear:(BOOL)animated {
        [super viewWillDisappear:animated];
        self.navigationController.navigationBarHidden = NO;
    }
    

    但是当从这个界面push到下一个界面的时候,有时候会碰到导航栏有半透明灰色的现象。如下图:


    image.png

    正常的效果:


    image.png
    大家可以看到明显的区别。(苹果自带导航栏默认颜色为(248,248,248))
    用Capture View Hierarchy查看,发觉有一层黑色的_UIVisualEffectBackdropView;如下:
    image.png

    遇到这种问题,我想到的有2中解决方案:
    1)然后我第一个想到的是,修改其背景颜色:但是当我获取NavigationBar的subview时,发觉找不到对应的view.

    for (UIView *subview in self.navigationController.navigationBar.subviews) {
            NSLog(@"----subview = %@",subview);
        }
    

    结果依次为:_UIBarBackground、_UINavigationBarLargeTitleView、_UINavigationBarContentView、_UINavigationBarModernPromptView,如下图


    image.png

    既然找不到对应的view,那就只好在view的最顶部添加一层view挡住;

    NSString *targetName = @"_UIBarBackground";
    Class _UIBarBackgroundClass = NSClassFromString(targetName);
        
    for (UIView *subview in self.navigationController.navigationBar.subviews) {
    if ([subview isKindOfClass:_UIBarBackgroundClass.class]) {
                
          UIView *overlay = [[UIView alloc] initWithFrame:subview.bounds];
          overlay.backgroundColor = RGBCOLOR(248, 248, 248);
          [subview insertSubview:overlay atIndex:0];
                
          break;
       }
    }
    

    在运行,发觉导航栏正常了。

    (但是想想感觉不对啊)
    我用Capture View Hierarchy查看层级关系,发现_UIVisualEffectBackdropView在添加的overlayview的上面,理论上,黑色应该还在的,但是莫名其妙变成白色了,现在一直没想清楚,如果哪位大佬明白,麻烦留言下。


    image.png image.png

    2)第二种想到的能解决的方法是直接设置navigationBar.translucent = NO。

     self.navigationController.navigationBar.translucent = NO;
    

    但是这样设置会导致所有VC下移,下移高度为导航栏的高度。如下图:


    image.png

    这时候需要重新设置所有VC中的tableview的frame:

    //原来
    initWithFrame:CGRectMake(0, Height_NavBarAndStatusBar, MAINSCREEN_WIDTH, MAINSCREEN_HEIGHT - Height_NavBarAndStatusBar)
    //现在修改为
    initWithFrame:CGRectMake(0, 0, MAINSCREEN_WIDTH, MAINSCREEN_HEIGHT - Height_NavBarAndStatusBar)
    

    相关文章

      网友评论

          本文标题:ios NavigationBar 导航栏半透明灰色

          本文链接:https://www.haomeiwen.com/subject/voskgctx.html