StatusBarStyle
使用 - preferredStatusBarStyle
plist的View controller-based status bar appearance
默认是YES。 表示view controller中对status bar的设置优先级高于application的设置。
单viewController的情况
- (UIStatusBarStyle)preferredStatusBarStyle{
return UIStatusBarStyleLightContent;
}
navigationController
viewcontroller受navigationController管理的情况,可以直接设置颜色或者交给viewcontroller管理:
- (UIStatusBarStyle)preferredStatusBarStyle{
return [self.viewControllers.lastObject preferredStatusBarStyle];
}
如何动态改变:
调用[self setNeedsStatusBarAppearanceUpdate];
举例:
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
[self setNeedsStatusBarAppearanceUpdate];
}
- (UIStatusBarStyle)preferredStatusBarStyle{
_flag = !_flag;
return _flag ? UIStatusBarStyleDefault : UIStatusBarStyleLightContent;
}
问题
有人说这个方法配合setNavigationBarHidden:animated:
一起使用会有问题:滑动一半再送手会出现导航条消失。
个人尝试并没有出现问题。
代码如下:
- (UIStatusBarStyle)preferredStatusBarStyle{
return UIStatusBarStyleLightContent;
}
- (void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
[self.navigationController setNavigationBarHidden:YES animated:animated];
}
- (void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
[self.navigationController setNavigationBarHidden:NO animated:animated];
}
- (UIStatusBarStyle)preferredStatusBarStyle{
return UIStatusBarStyleDefault;
}
使用[UIApplication sharedApplication].statusBarStyle
这算是iOS9以前的常用做法 。
plist的View controller-based status bar appearance
默认是YES,这时候[UIApplication sharedApplication].statusBarStyle
不生效了。
要用的话手动修改它为NO.
statusBar背景色
使用kvc,比较简单:
//设置状态栏颜色
- (void)setStatusBarBackgroundColor:(UIColor *)color {
UIView *statusBar = [[[UIApplication sharedApplication] valueForKey:@"statusBarWindow"] valueForKey:@"statusBar"];
if ([statusBar respondsToSelector:@selector(setBackgroundColor:)]) {
statusBar.backgroundColor = color;
}
}
但是需要谨慎。 iPhoneX statusbar不知道改名了没有。目前还没有测试。