深入理解iOS的状态栏

2020-01-18 16:13:32王振洲

两者是等效的!并且两者的状态是同步的。

二、状态栏样式

先看看都有哪些样式(解释看注释)


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

// iOS7.0以前黑底白字,iOS7以后跟UIStatusBarStyleLightContent效果一样
  UIStatusBarStyleBlackTranslucent NS_ENUM_DEPRECATED_IOS(2_0, 7_0, "Use UIStatusBarStyleLightContent") = 1,
// iOS7.0以前启动页为灰底白字,iOS7以后跟UIStatusBarStyleLightContent效果一样
  UIStatusBarStyleBlackOpaque   NS_ENUM_DEPRECATED_IOS(2_0, 7_0, "Use UIStatusBarStyleLightContent") = 2,
} __TVOS_PROHIBITED;

如何设置状态栏样式


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

同样iOS9以后这些方法被禁用了,苹果推荐在具体的viewControllerUse -[UIViewController preferredStatusBarStyle]


- (UIStatusBarStyle)preferredStatusBarStyle{
  return UIStatusBarStyleLightContent;
}

注意:我们通常使用的viewController都是嵌套在UINavigationController中使用的,此时在viewController中使用- (UIStatusBarStyle)preferredStatusBarStyle;函数会发现设置并没有生效。

系统也给我们提供了一个函数- (UIViewController *)childViewControllerForStatusBarStyle,也可以解决这个问题,后面会讲。

三、背景色

iOS7以后默认情况下状态栏的背景为透明的,一种办法是我们自己写一个UIView作为背景添加到状态栏下面,这样就可以随意设置状态栏的颜色了。

另一种方法就是通过设置navigationBarsetBarTintColor颜色来改变状态栏颜色

UIViewController中其他有关状态栏的函数

preferredStatusBarUpdateAnimation函数


- (UIStatusBarAnimation)preferredStatusBarUpdateAnimation 
NS_AVAILABLE_IOS(7_0) __TVOS_PROHIBITED; // Defaults to UIStatusBarAnimationFade

如果想在当前已经显示的UIViewController中更改状态栏的样式的话,需要调用以上函数。调用该函数后,系统会主动调用