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

背景

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

拿来直接用

方法一

  • 第一种情况(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重新获取控制权,所以设置生效。

转载于:https://juejin.im/post/5cd0fc50f265da035e213b33

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值