iOS 状态栏的那些事

info.plist中的View controller-based status bar appearance

  • 当取值为YES时,表示控制器对状态栏的设置的优先级高于通过application对状态栏进行的设置
  • 当取值为NO时,则以application为准,控制器设置状态栏preferredStatusBarStyle是无效的的根本不会被调用。
    在开发中要根据实际情况来设置View controller-based status bar appearance的值

修改状态栏的两种方式

  • 通过UIApplication
[[UIApplication sharedApplication]setStatusBarStyle:UIStatusBarStyleLightContent];  
//相对于上面的接口,这个接口可以动画的改变statusBar的前景色  
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent animated:YES];
  • 通过控制器
    在UIViewController中增加了几个接口,目的是让状态栏根据当前显示的 UIViewController来定制statusBar的外观
- (UIStatusBarStyle)preferredStatusBarStyle;
-(BOOL)prefersStatusBarHidden;
- (UIViewController *)childViewControllerForStatusBarStyle;
- (void)setNeedsStatusBarAppearanceUpdate;

- (UIStatusBarStyle)preferredStatusBarStyle

在你自己的UIViewController里重写此方法,返回你需要的值(UIStatusBarStyleDefault 或者 UIStatusBarStyleLightContent);

  • 注意点:
    这里如果你只是简单的return一个固定的值,那么该UIViewController显示的时候,程序就会马上调用该方法,来改变statusBar的外观。
    如果在该UIViewController已经在显示在当前时,你还要在当前页面不时的更改statusBar的前景色,那么,你首先需要调用下面的setNeedsStatusBarAppearanceUpdate方法(这个方法会通知系统去调用当前UIViewController的preferredStatusBarStyle方法), 这个和UIView的setNeedsDisplay原理差不多(调用UIView对象的setNeedsDisplay方法后,系统会在下次页面刷新时,调用重绘该view,系统最快能1秒刷新60次页面,具体要看程序设置)。

-(BOOL)prefersStatusBarHidden;

在这里方法里来设置状态栏的隐藏和显示

- (UIViewController *)childViewControllerForStatusBarStyle;

这个接口也很重要,默认返回值为nil。适用于根视图为UINavigationController的场景。
当我们调用setNeedsStatusBarAppearanceUpdate时,系统会调用application.window的rootViewController的preferredStatusBarStyle方法,我们的程序里一般都是用UINavigationController做root,如果是这种情况,那我们自己的UIViewController里的preferredStatusBarStyle根本不会被调用。这种情况下childViewControllerForStatusBarStyle就派上用场了,我们要子类化一个UINavigationController,在这个子类里面重写childViewControllerForStatusBarStyle方法,

-(UIViewController *)childViewControllerForStatusBarStyle
{
return self.topViewController;
}
  • 意思就是说,不要调用我自己(就是UINavigationController)的preferredStatusBarStyle方法,而是去调用navigationController.topViewController的preferredStatusBarStyle方法,这样写的话,就能保证当前显示的UIViewController的preferredStatusBarStyle方法能影响statusBar的外观。

- (void)setNeedsStatusBarAppearanceUpdate;

  • 这个方法会通知系统去调用当前UIViewController的preferredStatusBarStyle方法。

Status Bar 状态栏的隐藏

通过设置 Info.plist 文件实现状态栏的全局隐藏

  • 在 Info.plist 文件中添加 Status bar is initially hidden 设置为 YES ,这个是隐藏 App 在 LunchScreen(欢迎界面)时的状态栏。
  • 在 Info.plist 文件中添加 View controller-based status bar appearance 设置为 NO,这个是隐藏 App 在所有 UIViewController 时的状态栏。
    特别注意:
    当 Status bar is initially hidden 设置为 NO 的时候,不管 View controller-based status bar appearance 设置为 NO 还是 YES ,都是无效的,只有 Status bar is initially hidden 设置为 YES 的时候, View controller-based status bar appearance 才生效,这个要注意一下。

通过代码实现状态栏的全局隐藏

  • 在 Info.plist 文件中添加 View controller-based status bar appearance 设置为 NO
  • 在 AppDelegate 文件中,实现下面方法(在其他 UIViewController 中也有效)
// OC
[UIApplication sharedApplication].statusBarHidden = YES;
// Swift
UIApplication.sharedApplication().statusBarHidden = true

特别注意:
如果想要通过代码实现状态栏隐藏,必须在 Info.plist 文件中添加 View controller-based status bar appearance ,并且必须设置为 NO ,否则代码不会有任何效果,而且代码只能隐藏 App 在所有 UIViewController 时的状态栏,不能隐藏在 LunchScreen(欢迎界面)时的状态栏。

通过代码实现状态栏的局部隐藏
上面的方法是全局隐藏,是隐藏 App 在所有 UIViewController 时的状态栏,下面的方法是局部隐藏,是单个 UIViewController 内的隐藏

在 Info.plist 文件中添加 View controller-based status bar appearance 设置为 YES 。
在需要隐藏状态栏的 UIViewController 文件中,加入下面方法

// OC
- (BOOL)prefersStatusBarHidden {
    return YES;
}
// Swift
override func prefersStatusBarHidden() -> Bool {
    return true
}

特别注意:
如果想要通过代码实现某个 UIViewController 状态栏局部隐藏,必须在 Info.plist 文件中添加 View controller-based status bar appearance ,并且必须设置为 YES ,否则代码不会有任何效果。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值