谈一谈iOS开发中info.plist中的View controller-based status bar appearance属性

1、简介:

这是一个BOOL类型的属性,有YES和NO两个取值。
字面意思即———基于视图控制器的状态栏外观。

2、应用:

修改状态栏外观通常有两种做法:

  • 1、通过UIApplication
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];  
//相对于上面的接口,这个接口可以动画的改变statusBar的前景色  
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent animated:YES];
  • 2、通过控制器(UIVIewController)
    在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方法。

## 3、划重点
说了那么多,设置状态栏的外观到底跟View controller-based status bar appearance有什么关系呢,现在揭晓:
- 当取值为YES时,表示控制器对状态栏的设置的优先级高于application
 通过application对状态栏进行的设置将不起作用。

- 当取值为NO时,则以application为准,控制器设置状态栏preferredStatusBarStyle是无效的的根本不会被调用。

在开发中要根据实际情况来设置View controller-based status bar appearance的值。






你可能感兴趣的:(谈一谈iOS开发中info.plist中的View controller-based status bar appearance属性)