info.plist中的View controller-based status bar appearance(基于视图控制器的状态栏外观)不同值的设置方式
一、 设置为YES, 表示控制器对状态栏的设置的优先级高于application,通过application对状态栏进行的设置将不起作用(已设置StatusBarStyle为例,设置StatusBarHidden同理)
第一步、设置rootViewController(如果以下方式都用到,顺序调用),如下:
1、rootViewController 为UINavigationController:
首先需要自定义一个UINavigationController的子类,在这个子类里面重写childViewControllerForStatusBarStyle方法,如下:
- (UIViewController *)childViewControllerForStatusBarStyle { return self.topViewController;}
2、rootViewController 为UITabBarController:
- (UIViewController *)childViewControllerForStatusBarStyle { return self.selectedViewController;}
3、rootViewController 为UIViewController(使用addChildViewController加载了ViewController):
- (UIViewController *)childViewControllerForStatusBarStyle { UIViewController * vc = self.childViewControllers.lastObject; return vc;}
第二步、在业务Viewcontroller中实现方法,如下:
- (UIStatusBarStyle)preferredStatusBarStyle { return UIStatusBarStyleLightContent;}
二、设置为NO,则以application为准,控制器设置状态栏preferredStatusBarStyle是无效的的根本不会被调用
当前发现设置动态StatusBarHidden的设置会有问题,[[UIApplicationsharedApplication]setStatusBarHidden:hidden]会提示警告,而prefersStatusBarHidden又会失效,暂时不知道如何解决
在viewWillAppear(进来白色)实现如下方法:
- (UIStatusBarStyle)preferredStatusBarStyle { return UIStatusBarStyleLightContent;}
在viewWillDisappear(离开黑色)实现如下方法:
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
if (@available(iOS 13.0, *)) {
[UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleDarkContent;
} else {
[UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleDefault;
}
}
参考:https://www.jianshu.com/p/334e6974303a