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;

注意:讓我們先來看看// 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步中的兩種方式都要設置這個參數)

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;

如何設置狀態欄樣式

// 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;函數會發現設置並沒有生效。
這里鏈一篇關於這個問題的博客:UINavigationController和View Controller-based狀態欄風格

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

背景色

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

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

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

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

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

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;

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

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

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

所以我們要自己創建一個繼承於UINavigationcontroller
NavigationController,在這個子類中重寫
childViewControllerForStatusBarStyle函數

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

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

  • childViewControllerForStatusBarHidden函數
- (nullable UIViewController *)childViewControllerForStatusBarHidden NS_AVAILABLE_IOS(7_0) __TVOS_PROHIBITED;

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

動畫形式如下

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM