iOS 隐藏导航栏整个视图上移闪屏问题

作者: Eddiegooo | 来源:发表于2017-05-05 09:30 被阅读1310次

    在iOS开发中,特别是一些首页展示上要去掉导航栏(UINavigationBar)。
    最简单的办法在- (void)viewWillAppear:(BOOL)animated方法中直接设置隐藏导航栏,在(void)viewWillDisappear:(BOOL)animated方法中在显示出导航栏

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

    但是这样会出现一个问题,就是切换到这个界面的时候,会出现整个界面上移的效果,体验不是很好。如图所示的效果

    切换界面上移.gif

    这时候你可能想到是:你设置隐藏导航栏的时候animate动画设置为NO就不会上移了。 这样确实是不会有界面整体上移的假象,但是会出现另外一个问题,当你直接返回的时候都没有问题,一旦你用侧滑返回的时候,界面最上面导航栏那里就出现了异常,如图所示

    去掉动画隐藏效果.gif

    这到底应该怎么做呢???
    我的解决办法是:
    在要隐藏导航栏的界面的viewWillAppear方法中隐藏导航栏
    ,当你跳转进入到下一个的时候,要显示导航栏,在这个界面的viewWillAppear方法中设置导航栏出现。
    方法和上面的一致,

    //当前要隐藏导航栏的VC
    - (void)viewWillAppear:(BOOL)animated {
        [super viewWillAppear:animated];
        [self.navigationController setNavigationBarHidden:YES animated:YES];
    }
    
    //要显示导航栏的VC
    - (void)viewWillAppear:(BOOL)animated {
        [super viewWillAppear:animated];
        [self.navigationController setNavigationBarHidden:NO animated:YES];
    }
    

    这样就会避免了上面的两个问题。但是这样子做比较麻烦,就是你在当前隐藏导航栏的VC所有可跳转到的VC,都要设置一下显示导航栏。

    朋友们有别的解决方案,跪求告知,O(∩_∩)O谢谢

    2017.10.9补充一个问题点:

    在开发中可能会遇到在不同的界面改变导航栏颜色的需求,在不同的VC中重写了这个方法设置导航栏颜色,- (UIStatusBarStyle)preferredStatusBarStyle,就可能会出现异常。
    解决方案:

    其实解决的办法很简单,就是在导航控制器中重写childViewControllerForStatusBarStyle方法,如下:

    - (UIViewController *)childViewControllerForStatusBarStyle{
        return self.visibleViewController;
    }
    

    这句代码的作用是,不调用自己本身的preferredStatusBarStyle方法而是调用显示的控制器的preferredStatusBarStyle方法。

    相关文章

      网友评论

      • 缪雨轩:是写两个viewWillAppear嘛
        Eddiegooo:一个VC一个。
      • a04e23357a20:亲,我就是这样做的,但是为什么tab在切换的时候,隐藏导航栏的页面依然要上移闪屏
        Eddiegooo:@安之若素_6d9c 有帮助就好。 我想问下你是怎么解决的?
        a04e23357a20:@Eddiegooo 是的,因为我这边设计人员,设计的导航栏比较复杂,不过我已经解决了。还是谢谢啦!文章很有帮助
        Eddiegooo:你是用最下面那个比较麻烦的方式实现的吗?
        我验证过两次的,应该不会额,看它的执行顺序也不会出现的。

      本文标题:iOS 隐藏导航栏整个视图上移闪屏问题

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