转载请注明出处:http://www.jianshu.com/p/06c66676609a
作者:纪小衰
最近发现状态栏有很多问题,故写个demo验证下做个记录
测试环境:iOS11
1.状态栏的隐藏与显示
在工程的info.plist中可以设置属性View controller-based status bar appearance来控制状态栏的控制方式,
当值为YES的时候,状态栏的隐藏和显示取决于当前显示的viewController的覆写prefersStatusBarHidden方法,不重写则默认显示
(此时application控制无效)
- (BOOL)prefersStatusBarHidden{
return NO;
}
当值为NO的时候,状态栏的隐藏和显示可以通过application的属性来进行控制(此时复写方法无效)
[UIApplication sharedApplication].statusBarHidden = YES;
当不配置info.plist中的属性时,默认是根据controller复写的状态栏隐藏方法来判断的
推荐:info.plist中的属性设置为YES,通过每个viewController覆写对应的方法决定自己的界面显示时是否显示状态栏
2.状态栏的风格
状态栏的风格和显示同样有两种控制方式,方式一基于info.plist中View controller-based status bar appearance设置为NO,
此时通过下面的方法控制导航栏的风格
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefault animated:YES];
推荐还是下面这种使用每个控制器决定自己的导航栏风格方式
1.1对于一般的UIViewController可以通过覆写preferredStatusBarStyle方法来控制状态栏的风格
- (UIStatusBarStyle)preferredStatusBarStyle{
return UIStatusBarStyleLightContent; //显示白色的状态栏
}
1.2当一个UIViewController有自己的UINavigationController时,则此时的状态栏控制方法不会被调用,状态栏的风格取决于导航栏的风格。解决这种问题有两种方案
方案1:(但是一般好像这种方案不会被采用,因为要修改导航栏的样式)
通过self.navigationController.navigationBar.barStyle来修改导航栏风格
当设置UIBarStyleBlack时显示黑色的导航栏,白色的状态栏;
当设置为UIBarStyleDefault时显示白色的导航栏,黑色的状态栏
方案2:子类化UINavigationController,然后覆写childViewControllerForStatusBarStyle方法,让当前的状态栏风格取决于导航控制器的栈顶VC,这是viewController的preferredStatusBarStyle就可以起作用了
- (UIViewController *)childViewControllerForStatusBarStyle{
return self.topViewController;
}
1.3修改初始状态栏风格
通过设置info.plist中Status bar style中属性为UIStatusBarStyleDefault或UIStatusBarStyleLightContent
1.4在同一个界面动态修改状态栏风格,下面给出一种解决方案
@property (assign, nonatomic) UIStatusBarStyle style;
- (void)awakeFromNib{
[super awakeFromNib];
/*
不要在viewDidLoad设置初始值,因为preferredStatusBarStyle会在viewDidLoad之前调用,
可以根据控制器创建方式决定放在awakeFromNib或者init方法中
*/
self.style = UIStatusBarStyleLightContent;
}
- (void)viewDidLoad {
[super viewDidLoad];
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
self.style = UIStatusBarStyleDefault;
//调用下面的方法才能使界面再下一次刷新绘制的时候重新调用preferredStatusBarStyle改变状态栏
[self setNeedsStatusBarAppearanceUpdate];
});
}
- (UIStatusBarStyle)preferredStatusBarStyle{
return self.style;
}
对于同一个界面状态栏的隐藏和显示动态改变也可以采用上面的思路,但是有些时候状态栏的显示和隐藏会导致界面布局的问题,建议还是不要动态更改