深入理解iOS的狀態(tài)欄
一、狀態(tài)欄的隱藏
狀態(tài)欄的隱藏主要有兩種方法,下面來一起看看吧。
方法一:通過代碼控制
@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.這個注釋提示,蘋果提示開發(fā)者如果使用的是系統(tǒng)基礎的狀態(tài)欄樣式你的這些設置是不生效的,在接下來要介紹的通過Info.plist隱藏狀態(tài)欄同樣要注意這件事。
在Info.plist中添加一個View controller-based status bar appearance設置選項,設置為NO這樣就可以使用上邊的方法了

注意:添加的View controller-based status bar appearance是Bool類型,默認為Yes,很不幸iOS9之后蘋果已經不推薦使用這些方法了,這些方法能用但是會報警告。
那么這些方法被禁用以后,如何操作呢?注釋里已經提示Use -[UIViewController prefersStatusBarHidden]這是iOS7之后蘋果在UIViewController里添加的新方法,這么做的目的可以讓開發(fā)者更加靈活的自定義每個ViewController的狀態(tài)欄。
- (BOOL)prefersStatusBarHidden{
return YES;
}
iOS7之后UIViewController中不只提供了這個關于狀態(tài)欄的設置的函數(shù),還有其他的,后面詳細說。
方法二:通過Info.plist控制
1,首先我們依然要設置這個(第2步中的兩種方式都要設置這個參數(shù))

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

或者

兩者是等效的!并且兩者的狀態(tài)是同步的。
二、狀態(tài)欄樣式
先看看都有哪些樣式(解釋看注釋)
typedef NS_ENUM(NSInteger, UIStatusBarStyle) {
//默認樣式,黑字透明狀態(tài)欄,適合用于背景色為亮色的頁面
UIStatusBarStyleDefault = 0, // Dark content, for use on light backgrounds
//白字透明狀態(tài)欄,適合用于背景色為暗色的頁面
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;
如何設置狀態(tài)欄樣式
// 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以后這些方法被禁用了,蘋果推薦在具體的viewController中Use -[UIViewController preferredStatusBarStyle]
- (UIStatusBarStyle)preferredStatusBarStyle{
return UIStatusBarStyleLightContent;
}
注意:我們通常使用的viewController都是嵌套在UINavigationController中使用的,此時在viewController中使用- (UIStatusBarStyle)preferredStatusBarStyle;函數(shù)會發(fā)現(xiàn)設置并沒有生效。
系統(tǒng)也給我們提供了一個函數(shù)- (UIViewController *)childViewControllerForStatusBarStyle,也可以解決這個問題,后面會講。
三、背景色
iOS7以后默認情況下狀態(tài)欄的背景為透明的,一種辦法是我們自己寫一個UIView作為背景添加到狀態(tài)欄下面,這樣就可以隨意設置狀態(tài)欄的顏色了。
另一種方法就是通過設置navigationBar的setBarTintColor顏色來改變狀態(tài)欄顏色
UIViewController中其他有關狀態(tài)欄的函數(shù)
preferredStatusBarUpdateAnimation函數(shù)
- (UIStatusBarAnimation)preferredStatusBarUpdateAnimation NS_AVAILABLE_IOS(7_0) __TVOS_PROHIBITED; // Defaults to UIStatusBarAnimationFade
如果想在當前已經顯示的UIViewController中更改狀態(tài)欄的樣式的話,需要調用以上函數(shù)。調用該函數(shù)后,系統(tǒng)會主動調用preferredStatusBarStyle方法重繪狀態(tài)欄的樣式
childViewControllerForStatusBarStyle函數(shù)
// 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;
這個函數(shù)的返回值默認返回nil,此時系統(tǒng)就會調用當前viewControllerA的preferredStatusBarStyle函數(shù);如果返回值是另一個viewControllerB那么系統(tǒng)就會調用viewControllerB的preferredStatusBarStyle函數(shù)。
運用這個函數(shù)就可以解決嵌套UINavigationController設置樣式無效的問題。
解釋一下為什么嵌套UINavigationController的viewController的preferredStatusBarStyle函數(shù)設置無效:
在我們嵌套了UINavigationController的時候,我們的AppDelegate.window.rootViewController通常是我們創(chuàng)建的navigationController,這時首先會調用的是navigationController中的childViewControllerForStatusBarStyle函數(shù),因為默認返回nil,那么接下來就會調用navigationController本身的preferredStatusBarStyle函數(shù),所以我們在viewController中通過preferredStatusBarStyle函數(shù)設置的狀態(tài)欄樣式就不會被調用發(fā)現(xiàn),所以也就無效了。
所以我們要自己創(chuàng)建一個繼承于UINavigationcontroller的NavigationController,在這個子類中重寫childViewControllerForStatusBarStyle函數(shù)
- (UIViewController *)childViewControllerForStatusBarStyle{
return self.topViewController;
}
這樣navigationController中的childViewControllerForStatusBarStyle函數(shù)會返回navigationController中最上層的viewController,那么viewController中的preferredStatusBarStyle函數(shù)的設置就會被系統(tǒng)獲知
childViewControllerForStatusBarHidden函數(shù)
- (nullable UIViewController *)childViewControllerForStatusBarHidden NS_AVAILABLE_IOS(7_0) __TVOS_PROHIBITED;
childViewControllerForStatusBarHidden函數(shù)的使用原理同上,不再贅述。
preferredStatusBarUpdateAnimation函數(shù)
// 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;
這個函數(shù)返回了動畫效果。動畫效果只有在prefersStatusBarHidden函數(shù)返回值變化的時候才會展示,同時要通過調用
[self setNeedsStatusBarAppearanceUpdate]函數(shù)來重繪狀態(tài)欄
四、應用
我們可以通過隱藏系統(tǒng)狀態(tài)欄,然后自定義UIWindow通過設置setWindowLevel:UIWindowLevelStatusBar實現(xiàn)自定義狀態(tài)欄。
總結
以上就是這篇文章的全部內容了,希望能對各位iOS開發(fā)者們有所幫助,如果有疑問大家可以留言交流。
相關文章
Objective-C處理空字符串和頁面?zhèn)髦导白远x拷貝
這篇文章主要介紹了Objective-C處理空字符串和頁面?zhèn)髦导白远x拷貝的相關方法,在iOS應用項目開發(fā)中經常會用到,需要的朋友可以參考下2016-01-01
iOS應用中使用AsyncSocket庫處理Socket通信的用法講解
這篇文章主要介紹了iOS應用中使用AsyncSocket庫處理Socket通信的用法講解,AsyncSocket同時支持TCP和UDP,文中展示了其建立斷開連接及發(fā)送接收消息的操作,very好用,需要的朋友可以參考下2016-05-05
詳解Swift 利用Opration和OprationQueue來下載網絡圖片
這篇文章主要介紹了詳解Swift 利用Opration和OprationQueue來下載網絡圖片的相關資料,希望通過本文能幫助到大家,需要的朋友可以參考下2017-09-09

