背景
最近有一个需求,就是在单独某个页面去隐藏/显示状态栏,网上真的有很多方法,但是很混杂。。我也比较懒,先把结论放在前面是我的风格,可以拿来直接用。具体的原因可以在后面细看。
拿来直接用
方法一
- 第一种情况(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
重新获取控制权,所以设置生效。