1. 程式人生 > >iOS狀態列的設定statusBarStyle

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函式的使用原理同上,不再贅述。