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

在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方法。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容