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

在項目中遇到有關狀態(tài)欄樣式的問題,于是查閱了相關資料,總結了一下。希望對其他簡友們遇到相似的問題時有所幫助。有描述不對或者該補充的地方,也請各位多多指教。本文結構分兩部分,第一部分為場景+設置方法;第二部分為相關的背景知識。

第一部分


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

進入XcodeTargets->General->DeploymentInfo->Status Bar Style,設置其值為Default時,狀態(tài)欄樣式為黑色;設置其值為Light時,狀態(tài)欄樣式為白色。

設置方式2:

info.plist文件中,找到Status bar style鍵,設置其值為Gray style (default)時,狀態(tài)欄樣式為黑色;設置其值為UIStatusBarStyleLightContent時,狀態(tài)欄樣式為白色。


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

  2. 在程序啟動的地方設置,如下所示:

     - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
         // Override point for customization after application launch.    
       // 這種設置方式在iOS9之后廢棄,采用 -[UIViewController preferredStatusBarStyle]
       [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent]; //統(tǒng)一狀態(tài)欄樣式為白色
       //[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefault]; // 統(tǒng)一狀態(tài)欄樣式為黑色
    
       return YES;
     }
    

場景三:
  1. 整個應用程序狀態(tài)欄樣式不統(tǒng)一。狀態(tài)欄樣式由各界面的視圖控制器決定。
情況一:
  1. 該界面沒有導航控制器
設置方式:
  1. info.plist文件中添加 UIViewControllerBasedStatusBarAppearance鍵,并設置其值為YES?;蛘邉h除UIViewControllerBasedStatusBarAppearance鍵。

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

     - (UIStatusBarStyle)preferredStatusBarStyle {
       return UIStatusBarStyleLightContent;// 該控制器下的狀態(tài)欄樣式為白色
       // return UIStatusBarStyleDefault;// 該控制器下的狀態(tài)欄樣式為黑色
     }
    
情況二:
  1. 該界面有導航控制器
設置方式:
  1. info.plist文件中添加 UIViewControllerBasedStatusBarAppearance鍵,并設置其值為YES?;蛘邉h除UIViewControllerBasedStatusBarAppearance鍵。

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

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

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


第二部分

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

層級結構上分為背景視圖部分和前景視圖部分,前景視圖部分包含無限網絡連接標識,時間標識,藍牙狀態(tài)標識,電池電量標識等等可見內容。修改狀態(tài)欄內容樣式即改變前景視圖內容的顏色,分為白色和黑色兩種,白色樣式主要用于界面背景為黑色的時候,黑色樣式主要用于界面背景為淺色的時候。

  1. 關于前文中提到的UIViewControllerBasedStatusBarAppearance鍵:
    官方文檔關于此鍵的描述如下

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)選樣式。當此鍵不存在或者其值設置為YES時,由控制器來決定狀態(tài)欄樣式。當此鍵的值設置為NO時,視圖控制器(或應用程序)必須顯示的使用UIApplication對象顯示地設置狀態(tài)欄樣式。

當這個鍵設置為NO時,只能由UIApplication對象來控制狀態(tài)欄樣式。當設置為YES或不存在時,才能夠使用控制器對象來控制狀態(tài)欄樣式。

  1. 關于前文中提到的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)欄樣式時調用。如果您的容器視圖控制器從其子視圖控制器中導出其狀態(tài)欄樣式,請執(zhí)行此方法并返回該子視圖控制器。 如果返回nil或不覆蓋此方法,則會使用自身的狀態(tài)欄樣式。 如果此方法的返回值更改,請調用setNeedsStatusBarAppearanceUpdate方法。

當有導航控制器的時候,如果導航控制器的該方法返回nil,系統(tǒng)會調用導航控制器的preferredStatusBarStyle方法取到返回值,來決定狀態(tài)欄樣式。在導航控制器的該方法中返回子視圖控制器,則系統(tǒng)會調用其子視圖控制器的preferredStatusBarStyle方法來取到返回值,來決定狀態(tài)欄樣式。

  1. 關于上面提到的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ā)生更改,請調用此方法。 如果您在動畫塊中調用此方法,那么更改將與動畫塊的其余部分一起動畫。

調用此方法會重寫調用前面的childViewControllerForStatusBarStylepreferredStatusBarStyle方法來重置一次狀態(tài)欄。當想要主動改變狀態(tài)欄樣式時,可以主動調用此方法來重置狀態(tài)欄樣式。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容