状态栏: 是指iOS屏幕最上面的20像素高的部分,分为前景部分和背景部分
*前景部分: 包括电池、时间等部件;
*后景部分:显示颜色或图片的背景部分;
*状态栏字体为黑色:UIStatusBarStyleDefault(默认);
*状态栏字体为白色:UIStatusBarStyleLightContent;
方法一:
1、在Info.plist中,将View controller-based status bar appearance设为NO。(如没有此选项可自行添加)
2、在AppDelegate.m中
[UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleLightContent;
或者
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent animated:YES];
(这2种书写方式在iOS9.0以后,官方基本上已经不推荐了。当然还可以用,相比较,第二种书写方式会报警告,所以在这里我用第一种书写方式)
*注:到此步状态栏已经基本设置完成!
3、在个别状态栏字体颜色不一样的VC中
方法二:(iOS9.0以后官方推荐的,个人觉得老方法好用)
在Info.plist中,将View controller-based status bar appearance设为YES,或者不设置(默认值就是YES, 则[UIApplication sharedApplication].statusBarStyle无效)
1、在VC中重写VC的preferredStatusBarStyle方法
2、在viewDidload中调用:[self setNeedsStatusBarAppearanceUpdate] (刚开始的时候需要此调用,后来莫名其妙的的不需要了😭)
*注:当VC在nav中时,上面的方法无效,VC中的preferredStatusBarStyle方法根本不用被调用。 原因是,[self setNeedsStatusBarAppearanceUpdate]发出后,只会调用navigation controller中的preferredStatusBarStyle方法,vc中的preferredStatusBarStyley方法跟本不会被调用。
解决方法有两个:
一:自定义一个UINavigationController的子类,在这个子类中重写childViewControllerForStatusBarStyle方法
二:设置navbar的barStyle属性会影响statusBar的字体和背景色。如下。
//status bar的字体为白色
//导航栏的背景色是黑色。
self.navigationController.navigationBar.barStyle = UIBarStyleBlack;
//status bar的字体为黑色
//导航栏的背景色是白色,状态栏的背景色也是白色。
self.navigationController.navigationBar.barStyle = UIBarStyleDefault;
***!!!注释:iOS还很贴心的在UIViewController也增加了几个接口
1、- (UIStatusBarStyle)preferredStatusBarStyle;
在你自己的UIViewController里重写此方法,返回你需要的值(UIStatusBarStyleDefault 或者 UIStatusBarStyleLightContent);
**如果你只是简单的return一个固定的值,那么该UIViewController显示的时候,程序就会马上调用该方法,来改变statusBar的前景部分;
**VC在nav中时,上面的方法无效,VC中的preferredStatusBarStyle方法根本不用被调用。 原因是,[self setNeedsStatusBarAppearanceUpdate]发出后,只会调用navigation controller中的preferredStatusBarStyle方法,vc中的preferredStatusBarStyley方法跟本不会被调用。此时就需要重写childViewControllerForStatusBarStyle方法。
2、- (UIViewController *)childViewControllerForStatusBarStyle:
这个接口也很重要,默认返回值为nil。当我们调用setNeedsStatusBarAppearanceUpdate时,系统会调用application.window的rootViewController的preferredStatusBarStyle方法,我们的程序里一般都是用UINavigationController做root,如果是这种情况,那我们自己的UIViewController里的preferredStatusBarStyle根本不会被调用;
这种情况下childViewControllerForStatusBarStyle就派上用场了,
我们要子类化一个UINavigationController,在这个子类里面重写childViewControllerForStatusBarStyle方法,如下:
上面代码的意思就是,不调用UINavigationController的preferredStatusBarStyle,而是去调用navigationController.topViewController的preferredStatusBarStyle方法,这样写的话,就能保证当前显示的UIViewController的preferredStatusBarStyle方法能影响statusBar的前景部分。
简单的说,就是只要childViewControllerForStatusBarStyle的返回值不是nil,那么,UIViewController的preferredStatusBarStyle方法就不会被系统调用,系统会调用childViewControllerForStatusBarStyle方法返回的UIViewController的preferredStatusBarStyle方法
3,- (void)setNeedsStatusBarAppearanceUpdate:
!!!***此方法在实际测试中,我的测试结果是可有可无的一个方法。如果有哪位大神指导具体使用方法,求教!!!!!!