深入理解iOS的狀態(tài)欄
一、狀態(tài)欄的隱藏
狀態(tài)欄的隱藏主要有兩種方法,下面來(lái)一起看看吧。
方法一:通過(guò)代碼控制
@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;
注意:讓我們先來(lái)看看// Setting statusBarHidden does nothing if your application is using the default UIViewController-based status bar system.
這個(gè)注釋提示,蘋果提示開(kāi)發(fā)者如果使用的是系統(tǒng)基礎(chǔ)的狀態(tài)欄樣式你的這些設(shè)置是不生效的,在接下來(lái)要介紹的通過(guò)Info.plist隱藏狀態(tài)欄同樣要注意這件事。
在Info.plist
中添加一個(gè)View controller-based status bar appearance
設(shè)置選項(xiàng),設(shè)置為NO這樣就可以使用上邊的方法了
注意:添加的View controller-based status bar appearance
是Bool
類型,默認(rèn)為Yes,很不幸iOS9之后蘋果已經(jīng)不推薦使用這些方法了,這些方法能用但是會(huì)報(bào)警告。
那么這些方法被禁用以后,如何操作呢?注釋里已經(jīng)提示Use -[UIViewController prefersStatusBarHidden]
這是iOS7之后蘋果在UIViewController
里添加的新方法,這么做的目的可以讓開(kāi)發(fā)者更加靈活的自定義每個(gè)ViewController
的狀態(tài)欄。
- (BOOL)prefersStatusBarHidden{ return YES; }
iOS7之后UIViewController
中不只提供了這個(gè)關(guān)于狀態(tài)欄的設(shè)置的函數(shù),還有其他的,后面詳細(xì)說(shuō)。
方法二:通過(guò)Info.plist控制
1,首先我們依然要設(shè)置這個(gè)(第2步中的兩種方式都要設(shè)置這個(gè)參數(shù))
2,然后設(shè)置(兩種方式)
或者
兩者是等效的!并且兩者的狀態(tài)是同步的。
二、狀態(tài)欄樣式
先看看都有哪些樣式(解釋看注釋)
typedef NS_ENUM(NSInteger, UIStatusBarStyle) { //默認(rèn)樣式,黑字透明狀態(tài)欄,適合用于背景色為亮色的頁(yè)面 UIStatusBarStyleDefault = 0, // Dark content, for use on light backgrounds //白字透明狀態(tài)欄,適合用于背景色為暗色的頁(yè)面 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以前啟動(dòng)頁(yè)為灰底白字,iOS7以后跟UIStatusBarStyleLightContent效果一樣 UIStatusBarStyleBlackOpaque NS_ENUM_DEPRECATED_IOS(2_0, 7_0, "Use UIStatusBarStyleLightContent") = 2, } __TVOS_PROHIBITED;
如何設(shè)置狀態(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
中使用的,此時(shí)在viewController
中使用- (UIStatusBarStyle)preferredStatusBarStyle;
函數(shù)會(huì)發(fā)現(xiàn)設(shè)置并沒(méi)有生效。
系統(tǒng)也給我們提供了一個(gè)函數(shù)- (UIViewController *)childViewControllerForStatusBarStyle
,也可以解決這個(gè)問(wèn)題,后面會(huì)講。
三、背景色
iOS7以后默認(rèn)情況下?tīng)顟B(tài)欄的背景為透明的,一種辦法是我們自己寫(xiě)一個(gè)UIView
作為背景添加到狀態(tài)欄下面,這樣就可以隨意設(shè)置狀態(tài)欄的顏色了。
另一種方法就是通過(guò)設(shè)置navigationBar
的setBarTintColor
顏色來(lái)改變狀態(tài)欄顏色
UIViewController中其他有關(guān)狀態(tài)欄的函數(shù)
preferredStatusBarUpdateAnimation函數(shù)
- (UIStatusBarAnimation)preferredStatusBarUpdateAnimation NS_AVAILABLE_IOS(7_0) __TVOS_PROHIBITED; // Defaults to UIStatusBarAnimationFade
如果想在當(dāng)前已經(jīng)顯示的UIViewController
中更改狀態(tài)欄的樣式的話,需要調(diào)用以上函數(shù)。調(diào)用該函數(shù)后,系統(tǒng)會(huì)主動(dòng)調(diào)用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;
這個(gè)函數(shù)的返回值默認(rèn)返回nil
,此時(shí)系統(tǒng)就會(huì)調(diào)用當(dāng)前viewControllerA
的preferredStatusBarStyle
函數(shù);如果返回值是另一個(gè)viewControllerB
那么系統(tǒng)就會(huì)調(diào)用viewControllerB
的preferredStatusBarStyle
函數(shù)。
運(yùn)用這個(gè)函數(shù)就可以解決嵌套UINavigationController
設(shè)置樣式無(wú)效的問(wèn)題。
解釋一下為什么嵌套UINavigationController
的viewController
的preferredStatusBarStyle
函數(shù)設(shè)置無(wú)效:
在我們嵌套了UINavigationController
的時(shí)候,我們的AppDelegate.window.rootViewController
通常是我們創(chuàng)建的navigationController
,這時(shí)首先會(huì)調(diào)用的是navigationController
中的childViewControllerForStatusBarStyle
函數(shù),因?yàn)槟J(rèn)返回nil
,那么接下來(lái)就會(huì)調(diào)用navigationController
本身的preferredStatusBarStyle
函數(shù),所以我們?cè)?code>viewController中通過(guò)preferredStatusBarStyle
函數(shù)設(shè)置的狀態(tài)欄樣式就不會(huì)被調(diào)用發(fā)現(xiàn),所以也就無(wú)效了。
所以我們要自己創(chuàng)建一個(gè)繼承于UINavigationcontroller
的NavigationController
,在這個(gè)子類中重寫(xiě)childViewControllerForStatusBarStyle
函數(shù)
- (UIViewController *)childViewControllerForStatusBarStyle{ return self.topViewController; }
這樣navigationController
中的childViewControllerForStatusBarStyle
函數(shù)會(huì)返回navigationController
中最上層的viewController
,那么viewController
中的preferredStatusBarStyle
函數(shù)的設(shè)置就會(huì)被系統(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
動(dòng)畫(huà)形式如下
typedef NS_ENUM(NSInteger, UIStatusBarAnimation) { UIStatusBarAnimationNone, UIStatusBarAnimationFade NS_ENUM_AVAILABLE_IOS(3_2), UIStatusBarAnimationSlide NS_ENUM_AVAILABLE_IOS(3_2), } __TVOS_PROHIBITED;
這個(gè)函數(shù)返回了動(dòng)畫(huà)效果。動(dòng)畫(huà)效果只有在prefersStatusBarHidden
函數(shù)返回值變化的時(shí)候才會(huì)展示,同時(shí)要通過(guò)調(diào)用
[self setNeedsStatusBarAppearanceUpdate]
函數(shù)來(lái)重繪狀態(tài)欄
四、應(yīng)用
我們可以通過(guò)隱藏系統(tǒng)狀態(tài)欄,然后自定義UIWindow
通過(guò)設(shè)置setWindowLevel:UIWindowLevelStatusBar
實(shí)現(xiàn)自定義狀態(tài)欄。
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望能對(duì)各位iOS開(kāi)發(fā)者們有所幫助,如果有疑問(wèn)大家可以留言交流。
- iOS 自定義狀態(tài)欄和導(dǎo)航欄詳細(xì)介紹
- 詳解在iOS App中自定義和隱藏狀態(tài)欄的方法
- iOS實(shí)現(xiàn)點(diǎn)擊狀態(tài)欄自動(dòng)回到頂部效果詳解
- iOS 隱藏導(dǎo)航條和狀態(tài)欄實(shí)現(xiàn)方法
- 圖文講解如何解決App的iOS 7頂部狀態(tài)欄適配問(wèn)題
- iOS 設(shè)置狀態(tài)欄的背景顏色方法
- iOS在狀態(tài)欄上顯示提醒信息的功能定制
- IOS點(diǎn)擊按鈕隱藏狀態(tài)欄詳解及實(shí)例代碼
- IOS 開(kāi)發(fā)狀態(tài)欄隱藏的實(shí)現(xiàn)辦法
- iOS狀態(tài)欄、導(dǎo)航欄的一些筆記分享
相關(guān)文章
Objective-C處理空字符串和頁(yè)面?zhèn)髦导白远x拷貝
這篇文章主要介紹了Objective-C處理空字符串和頁(yè)面?zhèn)髦导白远x拷貝的相關(guān)方法,在iOS應(yīng)用項(xiàng)目開(kāi)發(fā)中經(jīng)常會(huì)用到,需要的朋友可以參考下2016-01-01ios12中遇到的帶input彈窗的錯(cuò)位問(wèn)題的解決方法
這篇文章主要介紹了ios12中遇到的帶input彈窗的錯(cuò)位問(wèn)題的解決方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-05-05iOS應(yīng)用中使用AsyncSocket庫(kù)處理Socket通信的用法講解
這篇文章主要介紹了iOS應(yīng)用中使用AsyncSocket庫(kù)處理Socket通信的用法講解,AsyncSocket同時(shí)支持TCP和UDP,文中展示了其建立斷開(kāi)連接及發(fā)送接收消息的操作,very好用,需要的朋友可以參考下2016-05-05詳解Swift 利用Opration和OprationQueue來(lái)下載網(wǎng)絡(luò)圖片
這篇文章主要介紹了詳解Swift 利用Opration和OprationQueue來(lái)下載網(wǎng)絡(luò)圖片的相關(guān)資料,希望通過(guò)本文能幫助到大家,需要的朋友可以參考下2017-09-09iOS開(kāi)發(fā)中Swift逃逸閉包知識(shí)
這篇文章主要介紹了iOS開(kāi)發(fā)中Swift逃逸閉包的相關(guān)知識(shí)點(diǎn)以及需要注意的地方,需要的朋友收藏下吧。2018-02-02