iOS狀態(tài)欄(UIStatusBar)總結(jié)

在項目中遇到有關(guān)狀態(tài)欄樣式的問題解愤,于是查閱了相關(guān)資料凤价,總結(jié)了一下。希望對其他簡友們遇到相似的問題時有所幫助鹏控。有描述不對或者該補充的地方威始,也請各位多多指教枢纠。本文結(jié)構(gòu)分兩部分,第一部分為場景+設(shè)置方法黎棠;第二部分為相關(guān)的背景知識晋渺。

第一部分


場景一:
  1. 統(tǒng)一啟動頁和啟動頁之后的視圖控制器狀態(tài)欄內(nèi)容樣式為白色或黑色。
設(shè)置方式1:

進入XcodeTargets->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)欄樣式為白色沸停。


場景二:
  1. 整個應(yīng)用程序狀態(tài)欄樣式統(tǒng)一為白色或黑色膜毁。
設(shè)置方式:
  1. info.plist文件中添加 UIViewControllerBasedStatusBarAppearance鍵,并設(shè)置其值為NO愤钾。

  2. 在程序啟動的地方設(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;
     }
    

場景三:
  1. 整個應(yīng)用程序狀態(tài)欄樣式不統(tǒng)一能颁。狀態(tài)欄樣式由各界面的視圖控制器決定杂瘸。
情況一:
  1. 該界面沒有導(dǎo)航控制器
設(shè)置方式:
  1. info.plist文件中添加 UIViewControllerBasedStatusBarAppearance鍵,并設(shè)置其值為YES劲装‰誓或者刪除UIViewControllerBasedStatusBarAppearance鍵昌简。

  2. 在視圖控制器中重寫方法如下所示:

     - (UIStatusBarStyle)preferredStatusBarStyle {
       return UIStatusBarStyleLightContent;// 該控制器下的狀態(tài)欄樣式為白色
       // return UIStatusBarStyleDefault;// 該控制器下的狀態(tài)欄樣式為黑色
     }
    
情況二:
  1. 該界面有導(dǎo)航控制器
設(shè)置方式:
  1. info.plist文件中添加 UIViewControllerBasedStatusBarAppearance鍵占业,并設(shè)置其值為YES〈渴辏或者刪除UIViewControllerBasedStatusBarAppearance鍵谦疾。

  2. 添加UINavigationController的分類(使用繼承也可以),在分類中重寫方法如下所示

     - (UIViewController *)childViewControllerForStatusBarStyle {
       return self.topViewController; // 返回導(dǎo)航控制器棧頂視圖控制器犬金,即當前顯示的控制器念恍。
     }
    
  3. 在當前顯示的視圖控制器中,重寫方法如下所示

     - (UIStatusBarStyle)preferredStatusBarStyle {
       return UIStatusBarStyleLightContent;// 該控制器下的狀態(tài)欄樣式為白色
       // return UIStatusBarStyleDefault;// 該控制器下的狀態(tài)欄樣式為黑色
     }
    


第二部分

  1. 狀態(tài)欄(UIStatusBar)的視圖層級結(jié)構(gòu):
使用Reveal查看的結(jié)果

層級結(jié)構(gòu)上分為背景視圖部分和前景視圖部分晚顷,前景視圖部分包含無限網(wǎng)絡(luò)連接標識峰伙,時間標識,藍牙狀態(tài)標識该默,電池電量標識等等可見內(nèi)容瞳氓。修改狀態(tài)欄內(nèi)容樣式即改變前景視圖內(nèi)容的顏色,分為白色和黑色兩種栓袖,白色樣式主要用于界面背景為黑色的時候匣摘,黑色樣式主要用于界面背景為淺色的時候。

  1. 關(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)欄樣式霜第。

  1. 關(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)欄樣式逗物。

  1. 關(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)用前面的childViewControllerForStatusBarStylepreferredStatusBarStyle方法來重置一次狀態(tài)欄失暴。當想要主動改變狀態(tài)欄樣式時坯门,可以主動調(diào)用此方法來重置狀態(tài)欄樣式。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末逗扒,一起剝皮案震驚了整個濱河市古戴,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌矩肩,老刑警劉巖现恼,帶你破解...
    沈念sama閱讀 216,324評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異蛮拔,居然都是意外死亡述暂,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評論 3 392
  • 文/潘曉璐 我一進店門建炫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來畦韭,“玉大人,你說我怎么就攤上這事肛跌∫张洌” “怎么了察郁?”我有些...
    開封第一講書人閱讀 162,328評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長转唉。 經(jīng)常有香客問我皮钠,道長,這世上最難降的妖魔是什么赠法? 我笑而不...
    開封第一講書人閱讀 58,147評論 1 292
  • 正文 為了忘掉前任麦轰,我火速辦了婚禮,結(jié)果婚禮上砖织,老公的妹妹穿的比我還像新娘款侵。我一直安慰自己,他們只是感情好侧纯,可當我...
    茶點故事閱讀 67,160評論 6 388
  • 文/花漫 我一把揭開白布新锈。 她就那樣靜靜地躺著,像睡著了一般眶熬。 火紅的嫁衣襯著肌膚如雪妹笆。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,115評論 1 296
  • 那天娜氏,我揣著相機與錄音拳缠,去河邊找鬼。 笑死牍白,一個胖子當著我的面吹牛脊凰,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播茂腥,決...
    沈念sama閱讀 40,025評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼切省!你這毒婦竟也來了最岗?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,867評論 0 274
  • 序言:老撾萬榮一對情侶失蹤朝捆,失蹤者是張志新(化名)和其女友劉穎般渡,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體芙盘,經(jīng)...
    沈念sama閱讀 45,307評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡驯用,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,528評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了儒老。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蝴乔。...
    茶點故事閱讀 39,688評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖驮樊,靈堂內(nèi)的尸體忽然破棺而出薇正,到底是詐尸還是另有隱情片酝,我是刑警寧澤,帶...
    沈念sama閱讀 35,409評論 5 343
  • 正文 年R本政府宣布挖腰,位于F島的核電站雕沿,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏猴仑。R本人自食惡果不足惜审轮,卻給世界環(huán)境...
    茶點故事閱讀 41,001評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望辽俗。 院中可真熱鬧断国,春花似錦、人聲如沸榆苞。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽坐漏。三九已至薄疚,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間赊琳,已是汗流浹背街夭。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評論 1 268
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留躏筏,地道東北人板丽。 一個月前我還...
    沈念sama閱讀 47,685評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像趁尼,于是被迫代替她去往敵國和親埃碱。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,573評論 2 353

推薦閱讀更多精彩內(nèi)容