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 ,否则代码不会有任何效果。