iOS狀態欄詳解

JamelThatch 7年前發布 | 8K 次閱讀 iOS開發 移動開發

狀態欄的隱藏

狀態欄的隱藏主要有兩種方法:

方法一:通過代碼控制

@interface UIApplication(UIApplicationDeprecated)

// 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 animated:(BOOL)animated NS_DEPRECATED_IOS(2_0, 3_2) __TVOS_PROHIBITED; // use -setStatusBarHidden:withAnimation:
  • (void)setStatusBarHidden:(BOOL)hidden withAnimation:(UIStatusBarAnimation)animation NS_DEPRECATED_IOS(3_2, 9_0, "Use -[UIViewController prefersStatusBarHidden]") __TVOS_PROHIBITED;</code></pre>

    注意:讓我們先來看看 // Setting statusBarHidden does nothing if your application is using the default UIViewController-based status bar system. 這個注釋提示,蘋果提示開發者 如果使用的是系統基礎的狀態欄樣式你的這些設置是不生效的 ,在接下來要介紹的通過 Info.plist 隱藏狀態欄同樣要注意這件事。

    在 Info.plist 中添加一個 View controller-based status bar appearance 設置選項,設置為 NO 這樣就可以使用上邊的方法了

    注意:添加的View controller-based status bar appearance是Bool類型,默認為Yes

    很不幸iOS9之后蘋果已經不推薦使用這些方法了,這些方法能用但是會報警告。

    那么這些方法被禁用以后,如何操作呢?注釋里已經提示 Use -[UIViewController prefersStatusBarHidden] 這是iOS7之后蘋果在 UIViewController 里添加的新方法,這么做的目的可以讓開發者更加靈活的自定義每個 ViewController 的狀態欄。

    - (BOOL)prefersStatusBarHidden{
      return YES;
    }

    iOS7之后 UIViewController 中不只提供了這個關于狀態欄的設置的函數,還有其他的,后面詳細說。

    方法二:通過 Info.plist 控制

    1,首先我們依然要設置這個(第2步中的兩種方式都要設置這個參數)

    iOS狀態欄詳解

    2,然后設置(兩種方式)

    或者

    兩者是等效的!并且兩者的狀態是同步的。

    狀態欄樣式

    先看看都有哪些樣式(解釋看注釋)

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

如何設置狀態欄樣式

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

    同樣iOS9以后這些方法被禁用了,蘋果推薦在具體的 viewController 中 Use -[UIViewController preferredStatusBarStyle]

    - (UIStatusBarStyle)preferredStatusBarStyle{
      return UIStatusBarStyleLightContent;
    }

    注意:我們通常使用的 viewController 都是嵌套在 UINavigationController 中使用的,此時在 viewController 中使用

    - (UIStatusBarStyle)preferredStatusBarStyle; 函數會發現設置并沒有生效。

    除了以上博客中的方法外,系統也給我們提供了一個函數 - (UIViewController *)childViewControllerForStatusBarStyle ,也可以解決這個問題,后面會講。

    背景色

    iOS7以后默認情況下狀態欄的背景為透明的,一種辦法是我們自己寫一個UIView作為背景添加到狀態欄下面,這樣就可以隨意設置狀態欄的顏色了。

    另一種方法就是通過設置 navigationBar 的 setBarTintColor 顏色來改變狀態欄顏色

    UIViewController中其他有關狀態欄的函數

    • preferredStatusBarUpdateAnimation函數
    - (UIStatusBarAnimation)preferredStatusBarUpdateAnimation 
    NS_AVAILABLE_IOS(7_0) TVOS_PROHIBITED; // Defaults to UIStatusBarAnimationFade</code></pre> 
    

    該函數是用來設置狀態欄顯示、消失時的動畫類型,動畫類型有:

    typedef NS_ENUM(NSInteger, UIStatusBarAnimation) {
      UIStatusBarAnimationNone,
      UIStatusBarAnimationFade NS_ENUM_AVAILABLE_IOS(3_2),
      UIStatusBarAnimationSlide NS_ENUM_AVAILABLE_IOS(3_2),
    } __TVOS_PROHIBITED;

    默認為 UIStatusBarAnimationFade ,當狀態欄隱藏、顯示狀態發生改變的時候,該函數的返回值就會發揮作用。

    • childViewControllerForStatusBarStyle函數
    // Override to return a child view controller or nil. If non-nil, that view controller's status bar appearance attributes will be used. If nil, self is used. Whenever the return values from these methods change, -setNeedsUpdatedStatusBarAttributes should be called.
  • (nullable UIViewController )childViewControllerForStatusBarStyle NS_AVAILABLE_IOS(7_0) __TVOS_PROHIBITED;</code></pre>

    這個函數的返回值默認返回 nil ,此時系統就會調用當前 viewControllerA 的 preferredStatusBarStyle 函數;如果返回值是另一個 viewControllerB 那么系統就會調用 viewControllerB 的 preferredStatusBarStyle 函數。

    運用這個函數就可以解決嵌套 UINavigationController 設置樣式無效的問題。

    解釋一下為什么嵌套 UINavigationController 的 viewController 的 preferredStatusBarStyle 函數設置無效:

    在我們嵌套了 UINavigationController 的時候,我們的

    AppDelegate.window.rootViewController

    通常是我們創建的 navigationController ,這時首先會調用的是 navigationController 中的 childViewControllerForStatusBarStyle 函數,因為默認返回 nil ,那么接下來就會調用 navigationController 本身的 preferredStatusBarStyle 函數,所以我們在 viewController 中通過 preferredStatusBarStyle 函數設置的狀態欄樣式就不會被調用發現,所以也就無效了。

    所以我們要自己創建一個繼承于 UINavigationcontroller 的

    NavigationController ,在這個子類中重寫

    childViewControllerForStatusBarStyle 函數

    - (UIViewController )childViewControllerForStatusBarStyle{
      return self.topViewController;
    }</code></pre> 
    

    這樣 navigationController 中的 childViewControllerForStatusBarStyle 函數會返回 navigationController 中最上層的 viewController ,那么 viewController 中的 preferredStatusBarStyle 函數的設置就會被系統獲知

    • childViewControllerForStatusBarHidden函數
    - (nullable UIViewController *)childViewControllerForStatusBarHidden 

NS_AVAILABLE_IOS(7_0) __TVOS_PROHIBITED;</code></pre>

childViewControllerForStatusBarHidden 函數的使用原理同上,不再贅述。

  • preferredStatusBarUpdateAnimation函數
// Override to return the type of animation that should be used for status bar changes for this view controller. This currently only affects changes to prefersStatusBarHidden.

  • (UIStatusBarAnimation)preferredStatusBarUpdateAnimation NS_AVAILABLE_IOS(7_0) __TVOS_PROHIBITED; // Defaults to UIStatusBarAnimationFade</code></pre>

    動畫形式如下

    typedef NS_ENUM(NSInteger, UIStatusBarAnimation) {
      UIStatusBarAnimationNone,
      UIStatusBarAnimationFade NS_ENUM_AVAILABLE_IOS(3_2),
      UIStatusBarAnimationSlide NS_ENUM_AVAILABLE_IOS(3_2),
    } __TVOS_PROHIBITED;

    這個函數返回了動畫效果。動畫效果只有在 prefersStatusBarHidden

    函數返回值變化的時候才會展示,同時要通過調用

    [self setNeedsStatusBarAppearanceUpdate] 函數來重繪狀態欄

    應用

    我們可以通過隱藏系統狀態欄,然后自定義 UIWindow
    通過設置 setWindowLevel:UIWindowLevelStatusBar 實現自定義狀態欄。

     

     

    來自:http://www.jianshu.com/p/4196d7cf95f4

     

 本文由用戶 JamelThatch 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!