iOS状态栏的设置statusBarStyle

关于状态栏statusBar颜色以及隐藏的设置,网上已经有很多答案了。由于本项目中对状态栏的修改是基于iOS9.0以上的设置,故整理一篇博客,希望能帮助有需要的同学。
首先介绍一下iOS9.0之前的设置:
在我们新建APP的时候,在General-Deployment Info-Status Bar Style这里有默认的全局设置,Default是黑色。Light是白色。

// 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;

@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;

iOS9 之前我们通常在Info.plist中添加一个View controller-based status bar appearance设置选项,设置为NO这样就可以使用上边的方法了
在info.plist中可以设置状态栏的外观是否是基于视图控制器,键的名称就是UIViewControllerBasedStatusBarAppearance,如果不设置那么它的默认值是YES,表示视图控制器决定了状态栏的风格;如果值设置为NO,则表示每个视图控制器必须显式地使用UIApplication对象来设置状态栏的风格。

statusBarStyle 状态栏的颜色 statusBarHidden 状态栏是否隐藏

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;

故设置状态栏白色 隐藏可通过UIApplication 调用

 [UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleLightContent;
  [UIApplication sharedApplication].statusBarHidden = YES;

总结一下,如果想改变StatusBar的显示风格,把UIViewControllerBasedStatusBarAppearance设置为NO,然后通过UIApplication对象设置StatusBar 的 Style就可以了。

但是上面的方法iOS9 之后就过期了,我们需要用他们提供的方法进行替换,注释里已经提示Use -[UIViewController prefersStatusBarHidden]这是iOS7之后苹果在UIViewController里添加的新方法,这么做的目的可以让开发者更加灵活的自定义每个ViewController的状态栏。

下面的方法是在ViewController中进行重写

- (UIStatusBarStyle)preferredStatusBarStyle {
    return UIStatusBarStyleLightContent;
}
- (BOOL)prefersStatusBarHidden {
    return NO;
}

调用上边的方法时需要调用[self setNeedsStatusBarAppearanceUpdate]函数来重绘状态栏,如果上边的方法不起作用,系统也给我们提供了一个函数, 可以解决这个问题

 (UIViewController *)childViewControllerForStatusBarStyle

是因为我们通常使用的viewController都是嵌套在UINavigationController中使用的,这个函数的返回值默认为nil,在我们嵌套了UINavigationController的时候,AppDelegate.window.rootViewController通常是我们创建navigationController,这时首先会调用navigationController中的childViewControllerForStatusBarStyle函数,因为默认返回nil,那么接下来就会调用ViewController本身的preferredStatusBarStyle函数,所以我们在viewController中通过preferredStatusBarStyle函数设置的状态栏样式就不会被调用,所以也就无效了。

所以我们自己要创建一个继承于UINavigationcontroller的NavigationController,在这个子类中重写childViewControllerForStatusBarStyle函数,根据自己情况,也可在父类中进行设置

- (UIViewController *)childViewControllerForStatusBarStyle{
    return self.topViewController;
}

这样navigationController中的childViewControllerForStatusBarStyle函数会返回navigationController中最上层的viewController,那么viewController中的preferredStatusBarStyle函数的设置就会被系统获知。
childViewControllerForStatusBarHidden函数的使用原理同上,不再赘述。

借鉴作者:MajorLMJ
来源:简书
链接:https://www.jianshu.com/p/4196d7cf95f4

你可能感兴趣的:(翻译代码)