iOS StatusBar那些事儿

这段时间工作也比较忙,很久没更新博客,在放假就更新一篇自己对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来通知系统调用preferredStatusBarStyleprefersStatusBarHidden方法。

启动页StatusBar设置

1 在Info.plist中设置Status bar style
2 想要设置隐藏则在Info.plist中设置Status bar is initially hidden

等价方法:

iOS StatusBar那些事儿_第1张图片

设置Status Bar StyleHide status bar即可。

你可能感兴趣的:(iOS StatusBar那些事儿)