功能-狀態(tài)欄statusBar的相關(guān)設(shè)置


設(shè)置statusBar的前景部分

狀態(tài)欄類型:

typedef NS_ENUM(NSInteger, UIStatusBarStyle) {
    UIStatusBarStyleDefault                                     = 0, // Dark content, for use on light backgrounds
    UIStatusBarStyleLightContent     NS_ENUM_AVAILABLE_IOS(7_0) = 1, // Light content, for use on dark backgrounds
    
    UIStatusBarStyleBlackTranslucent NS_ENUM_DEPRECATED_IOS(2_0, 7_0, "Use UIStatusBarStyleLightContent") = 1,
    UIStatusBarStyleBlackOpaque      NS_ENUM_DEPRECATED_IOS(2_0, 7_0, "Use UIStatusBarStyleLightContent") = 2,
} __TVOS_PROHIBITED;

狀態(tài)欄修改方式:

  • plist設(shè)置

    在plist添加一行UIStatusBarStyle(或Status bar style),值可以是

    • UIStatusBarStyleDefault
    • UIStatusBarStyleLightContent

    設(shè)置后app啟動的launch頁顯示的時(shí)候,statusBar的樣式就是上面plist設(shè)置的風(fēng)格.

  • 代碼設(shè)置

    • iOS 2.0 ~ 9.0

        [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent]; 
      
      [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent animated:YES];
      
  • iOS 7.0 ~

    Tag:

    ? UIViewcontroller或者UINavigationController都是控制器,下面統(tǒng)一叫它們控制器。

    ? 狀態(tài)欄statusBar是屬于UIApplication的一個(gè)UI,也就是說一個(gè)app只有一個(gè)狀態(tài)欄,并不是每一個(gè)控制器都擁有的屬性,所以在控制器中通過preferredStatusBarStyle方法修改的狀態(tài)欄樣式不一定有用,只有當(dāng)該控制器是當(dāng)前app的控制者的時(shí)候,狀態(tài)欄的樣式才會聽命于這個(gè)控制器。

    ? 一般我們都是寫一個(gè)UINavigationController作為window的rootViewController,其它的控制器都是在UINavigationController的管理下,app的控制權(quán)一直在UINavigationController手中,所以狀態(tài)欄的樣式只聽命于這個(gè)UINavigationController。

    ? 由此我們得出一種控制狀態(tài)欄風(fēng)格的方法,自定義一個(gè)UINavigationController,在自定義UINavigationController中實(shí)現(xiàn)preferredStatusBarStyle方法指定狀態(tài)欄樣式,只要更改這個(gè)自定義類中preferredStatusBarStyle方法里的值,就能更改狀態(tài)欄的風(fēng)格。

    ? 如果要讓這個(gè)UINavigationController管理的所有控制器也能通過preferredStatusBarStyle方法更改狀態(tài)欄風(fēng)格,可以通過childViewControllerForStatusBarStyle方法出借更改權(quán)限給指定的控制器,代碼如下:

    - (UIViewController *)childViewControllerForStatusBarStyle{
            return self.topViewController;
     }
    

    這樣在UINavigationController管理?xiàng)V械臈m斂刂破骶陀袡?quán)限控制器狀態(tài)欄了。

    ? 除此之外,我們也可以用模態(tài)跳轉(zhuǎn)的方式來控制器與控制器之間的跳轉(zhuǎn),這種情況下每個(gè)控制器都有權(quán)限控制狀態(tài)欄風(fēng)格。

    [self presentViewController:vc animated:YES completion:^{}];
    

    ?
    指定當(dāng)前控制器的狀態(tài)欄風(fēng)格

     - (UIStatusBarStyle)preferredStatusBarStyle;
    

    ?
    指定當(dāng)前控制器的子控制器讀取誰的狀態(tài)欄樣式,當(dāng)返回nil時(shí),默認(rèn)讀取自身設(shè)置的狀態(tài)欄樣式

      - (UIViewController *)childViewControllerForStatusBarStyle;  
    

    調(diào)用該方法,調(diào)用當(dāng)前擁有控制權(quán)的控制器的 -preferredStatusBarStyle方法刷新狀態(tài)欄風(fēng)格

      - (void)setNeedsStatusBarAppearanceUpdate;
    

設(shè)置statusBar的【背景部分】

  • iOS 7.0之前 通過tintColor修改
  • iOS 7.0之后 通過barTintColor修改

如果調(diào)用了以下方法,barTintColor將無效

- (void)setBackgroundImage:(nullable UIImage *)backgroundImage forBarPosition:(UIBarPosition)barPosition barMetrics:(UIBarMetrics)barMetrics 
NS_AVAILABLE_IOS(7_0) UI_APPEARANCE_SELECTOR;
      ```
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容