这段时间工作也比较忙,很久没更新博客,在放假就更新一篇自己对StatusBar的知识整理吧。
UIStatusBarStyle枚举
typedef NS_ENUM(NSInteger, UIStatusBarStyle) {
UIStatusBarStyleDefault = 0, // Dark content, for use on light backgrounds
UIStatusBarStyleLightContent NS_ENUM_AVAILABLE_IOS(7_0) = 1, // Light content, for use on dark backgrounds
UIStatusBarStyleBlackTranslucent NS_ENUM_DEPRECATED_IOS(2_0, 7_0, "Use UIStatusBarStyleLightContent") = 1,
UIStatusBarStyleBlackOpaque NS_ENUM_DEPRECATED_IOS(2_0, 7_0, "Use UIStatusBarStyleLightContent") = 2,
} __TVOS_PROHIBITED;
首先看一下UIStatusBarStyle的枚举
- UIStatusBarStyleDefault 字体为黑色
- UIStatusBarStyleLightContent 字体为白色
旧的设置方法
1 在Info.plist中将View controller-based status bar appearance
设为NO
2 在想要改变StatusBar颜色的地方设置
[UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleLightContent;
3 在想要隐藏StatusBar颜色的地方设置
[UIApplication sharedApplication].statusBarHidden = YES;
但到了iOS9之后这样做就会有警告
// Setting the statusBarStyle does nothing if your application is using the default UIViewController-based status bar system.
@property(readwrite, nonatomic) UIStatusBarStyle statusBarStyle NS_DEPRECATED_IOS(2_0, 9_0, "Use -[UIViewController preferredStatusBarStyle]") __TVOS_PROHIBITED;
- (void)setStatusBarStyle:(UIStatusBarStyle)statusBarStyle animated:(BOOL)animated NS_DEPRECATED_IOS(2_0, 9_0, "Use -[UIViewController preferredStatusBarStyle]") __TVOS_PROHIBITED;
// Setting statusBarHidden does nothing if your application is using the default UIViewController-based status bar system.
@property(readwrite, nonatomic,getter=isStatusBarHidden) BOOL statusBarHidden NS_DEPRECATED_IOS(2_0, 9_0, "Use -[UIViewController prefersStatusBarHidden]") __TVOS_PROHIBITED;
- (void)setStatusBarHidden:(BOOL)hidden withAnimation:(UIStatusBarAnimation)animation NS_DEPRECATED_IOS(3_2, 9_0, "Use -[UIViewController prefersStatusBarHidden]") __TVOS_PROHIBITED;
注意:Info.plist文件中,View controller-based status bar appearance
设为YES,则View controller对StatusBar的设置优先级高于application的设置。为NO则以application的设置为准。
新的设置方法
1 在Info.plist中将View controller-based status bar appearance
设为YES
2 在ViewController中重写方法preferredStatusBarStyle
- (UIStatusBarStyle)preferredStatusBarStyle {
return UIStatusBarStyleLightContent;
}
但是,你会发现当ViewController在NavgationController中时该方法不会被调用。原因是NavgationController的childViewControllerForStatusBarStyle
默认返回的是nil,这时系统调用的实际上是NavgationController的preferredStatusBarStyle
方法。
解决方法是定义一个NavgationController的子类,在子类中重写方法
- (UIViewController *)childViewControllerForStatusBarStyle {
return self.topViewController;
}
3 在ViewController中重写方法prefersStatusBarHidden
- (BOOL)prefersStatusBarHidden {
return YES;
}
这里就比较迷了,我原以为和preferredStatusBarStyle
一样在ViewController在NavgationController中时该方法不会被调用,但事实上却调用了。打印NavgationController的childViewControllerForStatusBarHidden
,发现它默认返回的就是topViewController
。这我就不是很懂了,如果有知道的我们一起交流交流。
4 在ViewController已经显示的情况下想要更改StatusBar,我们可以主动调用setNeedsStatusBarAppearanceUpdate
来通知系统调用preferredStatusBarStyle
和prefersStatusBarHidden
方法。
启动页StatusBar设置
1 在Info.plist中设置Status bar style
2 想要设置隐藏则在Info.plist中设置Status bar is initially hidden
等价方法:
设置Status Bar Style
和Hide status bar
即可。