iOS关于状态栏隐藏的问题(OC)

2,604 阅读1分钟

背景

最近有一个需求,就是在单独某个页面去隐藏/显示状态栏,网上真的有很多方法,但是很混杂。这里推荐一篇文章。我也比较懒,先把结论放在前面是我的风格,可以拿来直接用。具体的原因可以在后面细看。

拿来直接用

方法一

  • 第一种情况(vc嵌套在Nav中)

自定义一个导航控制器,继承UINavigationController,重写 - (UIViewController *)childViewControllerForStatusBarHidden 方法,返回 self.topViewController

#import "BHNavigationController.h"

@implementation BHNavigationController

- (UIViewController *)childViewControllerForStatusBarHidden {
    return self.topViewController;
}

@end

在需要隐藏状态栏的控制器中,调用 - (BOOL)prefersStatusBarHidden 方法即可

- (BOOL)prefersStatusBarHidden {
    return YES;
}
  • 第二种情况(单纯的vc,没有任何嵌套,可能是model出来的控制器)

直接设置 - (BOOL)prefersStatusBarHidden 方法即可

方法二,利用Category

  • 创建一个UINavigationController的分类
  • 重写 - (BOOL)prefersStatusBarHidden 方法,这样就会先调用分类中的方法,而不去调用原来的方法
- (BOOL)prefersStatusBarHidden {
    return [[self topViewController] prefersStatusBarHidden];
}

在需要隐藏状态栏的控制器,调用- (BOOL)prefersStatusBarHidden方法控制隐藏/展示即可

如果你的需求不是隐藏状态栏,而是设置状态栏的样式,同理,这里就不写重复的东西了

分析原因

为什么嵌套的情况下,却不调用 - (BOOL)prefersStatusBarHidden 方法?

  • 在我们嵌套了 UINavigationController 的时候,此时控制权在 UINavigationController中,所以这时调用的是navigationController本身的 prefersStatusBarHidden 方法,所以我们通过上述的两种方式,让导航控制器中的topViewController重新获取控制权,所以设置生效。