知识普及
ios上状态栏 就是指的最上面的20像素高的部分
状态栏分前后两部分,要分清这两个概念,后面会用到:
- 前景部分:就是指的显示电池、时间等部分;
- 背景部分:就是显示黑色或者图片的背景部分;
如下图:前景部分为白色,背景部分为黑色
注意:这里只涉及到ios7以及更高版本,低版本下面的讲解可能无效。
设置statusBar的【前景部分】
简单来说,就是设置显示电池电量、时间、网络部分标示的颜色,
- 这里只能设置两种颜色:
- 默认的黑色(
UIStatusBarStyleDefault
) - 白色(
UIStatusBarStyleLightContent
)
- 默认的黑色(
- 可以设置的地方有两个:plist设置里面 和 程序代码里
plist设置statusBar
在plist里增加一行 UIStatusBarStyle(或者是“Status bar style”也可以),这里可以设置两个值,就是上面提到那两个
UIStatusBarStyleDefault
和UIStatusBarStyleLightContent
这样在app启动的launch页显示的时候,statusBar的样式就是上面plist设置的风格。程序代码里设置statusBar
UIViewController也增加了几个接口,用来做设置
综述:status bar以下简称SB
|决定SB样式|决定是否隐藏SB| 调用处|
|:|:|:|
|preferredStatusBarStyle|prefersStatusBarHidden| 在实际需要显示SB的VC中调用|
|决定SB在哪个VC生效样式|决定SB在哪个VC隐藏|调用处|
|:|:|:|
|childViewControllerForStatusBarStyle|childViewControllerForStatusBarHidden|container或者说parentVC|
|决定SB生效更新时机|决定SB隐藏生效时机|调用处|
|:|:|:|
|setNeedsStatusBarAppearanceUpdate|setNeedsStatusBarAppearanceUpdate|container/调度处|
逐一说明
- -(UIStatusBarStyle)preferredStatusBarStyle:
在你自己的UIViewController里重写此方法,返回你需要的值(UIStatusBarStyleDefault
或者UIStatusBarStyleLightContent
); - -(BOOL)prefersStatusBarHidden
决定你的status bar 是否隐藏!
注意:
如果在该UIViewController已经在显示在当前,你可能还要在当前页面不时的更改statusBar的前景色,那么,你首先需要调用下面的setNeedsStatusBarAppearanceUpdate方法(这个方法会通知系统去调用当前UIViewController的preferredStatusBarStyle方法), 这个和UIView的setNeedsDisplay原理差不多(调用UIView对象的setNeedsDisplay方法后,系统会在下次页面刷新时,调用重绘该view,系统最快能1秒刷新60次页面,具体要看程序设置)。
- -(UIViewController *)childViewControllerForStatusBarStyle
- -(UIViewController *)childViewControllerForStatusBarHidden
先来看代码原文注释的解读:
重写,用于返回一个child view 或 nil.- 非空,那么返回的那个child view的 status bar就会被调用到。
- 为空,调用当前(container)自身的status bar
不论返回值如何变化,都必须调用setNeedsUpdatedStatusBarAttributes
方法
这个接口也很重要,默认返回值为nil。当我们调用setNeedsStatusBarAppearanceUpdate
时,系统会调用application.window的rootViewController的preferredStatusBarStyle方法。
TIPS:若程序里用UINavigationController做root,如果是这种情况,那我们自己的UIViewController里的preferredStatusBarStyle根本不会被调用;
- -(void)setNeedsStatusBarAppearanceUpdate:
StatusBar 在需要隐藏或改变样式时在UIViewConroller中调用
下面用一幅图来直观的解释
TIPS: 注意三个函数各自调度的时机和地点。prefer 是调用哪个VC就在哪个VC中去设置(这很好理解,我要调用你了你就告诉我你是什么样式,是否隐藏)