在項目中遇到有關(guān)狀態(tài)欄樣式的問題解愤,于是查閱了相關(guān)資料凤价,總結(jié)了一下。希望對其他簡友們遇到相似的問題時有所幫助鹏控。有描述不對或者該補充的地方威始,也請各位多多指教枢纠。本文結(jié)構(gòu)分兩部分,第一部分為場景+設(shè)置方法黎棠;第二部分為相關(guān)的背景知識晋渺。
第一部分
場景一:
- 統(tǒng)一啟動頁和啟動頁之后的視圖控制器狀態(tài)欄內(nèi)容樣式為白色或黑色。
設(shè)置方式1:
進入Xcode
的Targets
->General
->DeploymentInfo
->Status Bar Style
脓斩,設(shè)置其值為Default
時木西,狀態(tài)欄樣式為黑色;設(shè)置其值為Light
時随静,狀態(tài)欄樣式為白色八千。
設(shè)置方式2:
在info.plist
文件中吗讶,找到Status bar style
鍵,設(shè)置其值為Gray style (default)
時恋捆,狀態(tài)欄樣式為黑色照皆;設(shè)置其值為UIStatusBarStyleLightContent
時,狀態(tài)欄樣式為白色沸停。
場景二:
- 整個應(yīng)用程序狀態(tài)欄樣式統(tǒng)一為白色或黑色膜毁。
設(shè)置方式:
在
info.plist
文件中添加UIViewControllerBasedStatusBarAppearance
鍵,并設(shè)置其值為NO愤钾。-
在程序啟動的地方設(shè)置瘟滨,如下所示:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // Override point for customization after application launch. // 這種設(shè)置方式在iOS9之后廢棄,采用 -[UIViewController preferredStatusBarStyle] [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent]; //統(tǒng)一狀態(tài)欄樣式為白色 //[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefault]; // 統(tǒng)一狀態(tài)欄樣式為黑色 return YES; }
場景三:
- 整個應(yīng)用程序狀態(tài)欄樣式不統(tǒng)一能颁。狀態(tài)欄樣式由各界面的視圖控制器決定杂瘸。
情況一:
- 該界面沒有導(dǎo)航控制器
設(shè)置方式:
在
info.plist
文件中添加UIViewControllerBasedStatusBarAppearance
鍵,并設(shè)置其值為YES劲装‰誓或者刪除UIViewControllerBasedStatusBarAppearance
鍵昌简。-
在視圖控制器中重寫方法如下所示:
- (UIStatusBarStyle)preferredStatusBarStyle { return UIStatusBarStyleLightContent;// 該控制器下的狀態(tài)欄樣式為白色 // return UIStatusBarStyleDefault;// 該控制器下的狀態(tài)欄樣式為黑色 }
情況二:
- 該界面有導(dǎo)航控制器
設(shè)置方式:
在
info.plist
文件中添加UIViewControllerBasedStatusBarAppearance
鍵占业,并設(shè)置其值為YES〈渴辏或者刪除UIViewControllerBasedStatusBarAppearance
鍵谦疾。-
添加
UINavigationController
的分類(使用繼承也可以),在分類中重寫方法如下所示- (UIViewController *)childViewControllerForStatusBarStyle { return self.topViewController; // 返回導(dǎo)航控制器棧頂視圖控制器犬金,即當前顯示的控制器念恍。 }
-
在當前顯示的視圖控制器中,重寫方法如下所示
- (UIStatusBarStyle)preferredStatusBarStyle { return UIStatusBarStyleLightContent;// 該控制器下的狀態(tài)欄樣式為白色 // return UIStatusBarStyleDefault;// 該控制器下的狀態(tài)欄樣式為黑色 }
第二部分
- 狀態(tài)欄(
UIStatusBar
)的視圖層級結(jié)構(gòu):
層級結(jié)構(gòu)上分為背景視圖部分和前景視圖部分晚顷,前景視圖部分包含無限網(wǎng)絡(luò)連接標識峰伙,時間標識,藍牙狀態(tài)標識该默,電池電量標識等等可見內(nèi)容瞳氓。修改狀態(tài)欄內(nèi)容樣式即改變前景視圖內(nèi)容的顏色,分為白色和黑色兩種栓袖,白色樣式主要用于界面背景為黑色的時候匣摘,黑色樣式主要用于界面背景為淺色的時候。
- 關(guān)于前文中提到的
UIViewControllerBasedStatusBarAppearance
鍵:
官方文檔關(guān)于此鍵的描述如下
UIViewControllerBasedStatusBarAppearance (Boolean - iOS) Specifies whether the status bar appearance is based on the style preferred by the view controller that is currently under the status bar. When this key is not present or its value is set to YES, the view controller determines the status bar style. When the key is set to NO, view controllers (or the app) must each set the status bar style explicitly using the UIApplication object.
This key is supported in iOS 7.0 and later.
翻譯:指定狀態(tài)欄的外觀是否基于當前位于狀態(tài)欄下的控制器的優(yōu)選樣式裹刮。當此鍵不存在或者其值設(shè)置為YES時音榜,由控制器來決定狀態(tài)欄樣式。當此鍵的值設(shè)置為NO時捧弃,視圖控制器(或應(yīng)用程序)必須顯示的使用UIApplication對象顯示地設(shè)置狀態(tài)欄樣式赠叼。
當這個鍵設(shè)置為NO時,只能由UIApplication對象來控制狀態(tài)欄樣式。當設(shè)置為YES或不存在時嘴办,才能夠使用控制器對象來控制狀態(tài)欄樣式霜第。
- 關(guān)于前文中提到的
childViewControllerForStatusBarStyle
:
官方文檔的描述如下:
Called when the system needs the view controller to use for determining status bar style.
If your container view controller derives its status bar style from one of its child view controllers, implement this method and return that child view controller. If you return nil or do not override this method, the status bar style for self is used. If the return value from this method changes, call the setNeedsStatusBarAppearanceUpdate method.
翻譯:當系統(tǒng)需要視圖控制器用于確定狀態(tài)欄樣式時調(diào)用。如果您的容器視圖控制器從其子視圖控制器中導(dǎo)出其狀態(tài)欄樣式户辞,請執(zhí)行此方法并返回該子視圖控制器泌类。 如果返回nil或不覆蓋此方法,則會使用自身的狀態(tài)欄樣式底燎。 如果此方法的返回值更改刃榨,請調(diào)用
setNeedsStatusBarAppearanceUpdate
方法。
當有導(dǎo)航控制器的時候双仍,如果導(dǎo)航控制器的該方法返回nil枢希,系統(tǒng)會調(diào)用導(dǎo)航控制器的preferredStatusBarStyle
方法取到返回值,來決定狀態(tài)欄樣式朱沃。在導(dǎo)航控制器的該方法中返回子視圖控制器苞轿,則系統(tǒng)會調(diào)用其子視圖控制器的preferredStatusBarStyle
方法來取到返回值,來決定狀態(tài)欄樣式逗物。
- 關(guān)于上面提到的
setNeedsStatusBarAppearanceUpdate
:
官方文檔的描述如下:
Indicates to the system that the view controller status bar attributes have changed.
Call this method if the view controller's status bar attributes, such as hidden/unhidden status or style, change. If you call this method within an animation block, the changes are animated along with the rest of the animation block.
翻譯:向系統(tǒng)指示視圖控制器狀態(tài)欄屬性已更改搬卒。如果視圖控制器的狀態(tài)欄屬性(如隱藏/未隱藏狀態(tài)或樣式)發(fā)生更改,請調(diào)用此方法翎卓。 如果您在動畫塊中調(diào)用此方法契邀,那么更改將與動畫塊的其余部分一起動畫。
調(diào)用此方法會重寫調(diào)用前面的childViewControllerForStatusBarStyle
和preferredStatusBarStyle
方法來重置一次狀態(tài)欄失暴。當想要主動改變狀態(tài)欄樣式時坯门,可以主動調(diào)用此方法來重置狀態(tài)欄樣式。