天天看點

iOS Status Bar 狀态欄設定彙總

總結:

  • 1) Status bar is initially hidden為NO時View controller-based status bar appearance不生效
  • 2)View controller-based status bar appearance為NO時preferredStatusBarStyle和prefersStatusBarHidden方法不生效
  • 3)UIViewController 在 UINavigationController 導航欄中時,在UIViewController中設定, preferredStatusBarStyle 不生效根本不會走,因為 UINavigationController 中也有 preferredStatusBarStyle 這個方法,會走UINavigationController,需要重寫UINavigationController中的方法方能生效(可以通過分類的方式或者baseNavigationde 方式)。

1. 通過設定 Info.plist 檔案實作狀态欄的全局隐藏

在 Info.plist 檔案中添加

  • Status bar is initially hidden

    設定為 YES ,這個是隐藏 App 在 LunchScreen(歡迎界面)時的狀态欄。

    隻隐藏LunchScreen的開啟頁面,其他頁面需要局部隐藏就通過prefersStatusBarHidden隐藏

    iOS Status Bar 狀态欄設定彙總
    image.png
iOS Status Bar 狀态欄設定彙總

image.png

  • View controller-based status bar appearance

    設定為 NO這個是隐藏 App 在

    所有

    UIViewController 時的狀态欄。【當然同時要項目勾選Hide status bar,這個沒有勾選,也不會隐藏】

    除了LunchScreen的開啟頁面不隐藏,其他頁面全部隐藏

    iOS Status Bar 狀态欄設定彙總
    image.png
    iOS Status Bar 狀态欄設定彙總
    image.png
  • 特别注意
  • 1)當 Status bar is initially hidden 設定為 NO 的時候,不管 View controller-based status bar appearance 設定為 NO 還是 YES ,都是無效的。
  • 2)隻有 Status bar is initially hidden 設定為 YES 的時候, View controller-based status bar appearance 才生效,這個要注意一下。

2. 通過代碼實作狀态欄的全局隐藏

  • 在 Info.plist 檔案中添加 View controller-based status bar appearance 設定為 NO 。
  • 在 AppDelegate 檔案中,實作下面方法(在其他 UIViewController 中也有效):
// OC
[UIApplication sharedApplication].statusBarHidden = YES;

// SwiftUI
Application.sharedApplication().statusBarHidden = true
           

特别注意:####

  • 如果使用statusBarHidden屬性來實作狀态欄隐藏,必須在 Info.plist 檔案中添加 View controller-based status bar appearance ,并且必須設定為 NO ,否則代碼不會有任何效果,而且代碼隻能隐藏 App 在所有 UIViewController 時的狀态欄,不能隐藏在 LunchScreen(歡迎界面)時的狀态欄。

3. 通過代碼實作狀态欄的局部隐藏

上面的方法是全局隐藏,是隐藏 App 在所有 UIViewController 時的狀态欄,下面的方法是局部隐藏,是單個 UIViewController 内的隐藏。

  • 在 Info.plist 檔案中添加 View controller-based status bar appearance 設定為 YES 。
  • 在需要隐藏狀态欄的 UIViewController 檔案中,加入下面方法:
// OC- (BOOL)prefersStatusBarHidden {    
return YES;
}

// Swift
override func prefersStatusBarHidden() -> Bool {   
 return true
}
           

特别注意:

如果想要通過代碼實作某個 UIViewController 狀态欄局部隐藏,必須在 Info.plist 檔案中添加 View controller-based status bar appearance ,并且必須設定為 YES ,否則代碼不會有任何效果。

4、Status Bar 狀态欄的顔色

狀态欄分前後兩部分,要厘清這兩個概念,後面會用到:

  • 文字部分:就是指的顯示電池、時間等部分。
  • 背景部分:就是顯示黑色或者圖檔的背景部分。
iOS Status Bar 狀态欄設定彙總

image

文字部分為白色,背景部分為黑色

1. 設定 Status Bar 的【文字部分】

簡單來說,就是設定顯示電池電量、時間、網絡部分标示的顔色, 這裡隻能設定兩種顔色:

// 預設的黑色
UIStatusBarStyleDefault
// 白色
UIStatusBarStyleLightContent
           

1)通過設定 Info.plist 檔案全局設定狀态欄的文字顔色

  • 在 Info.plist 裡增加一行 UIStatusBarStyle( Status bar style 也可以),這裡可以設定兩個值,就是上面提到那兩個 UIStatusBarStyleDefault 和 UIStatusBarStyleLightContent 。
iOS Status Bar 狀态欄設定彙總

image

Info.plist

2)通過代碼全局設定狀态欄的文字顔色

  • 在 Info.plist 檔案中添加 View controller-based status bar appearance 設定為 NO (理論同上,必須添加且必須設定為 NO ,否則不生效)。
  • 在 AppDelegate 檔案中,實作下面方法(在其他 UIViewController 中也有效):
// OC
[UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleLightContent;

// Swift
UIApplication.sharedApplication().statusBarStyle = UIStatusBarStyle.LightContent
           

3)通過代碼局部設定狀态欄的文字顔色

  • 在 Info.plist 檔案中添加 View controller-based status bar appearance 設定為 YES (理論同上,必須添加且必須設定為 YES ,否則不生效) 。
  • 在需要設定狀态欄顔色的 UIViewController 檔案中,加入下面方法:
// OC
- (UIStatusBarStyle)preferredStatusBarStyle {   
 return UIStatusBarStyleLightContent;
}

// Swift
override func preferredStatusBarStyle() -> UIStatusBarStyle {   
 return UIStatusBarStyle.LightContent
}
           

**但是!! **當 UIViewController 在 UINavigationController 導航欄中時,上面方法沒用, preferredStatusBarStyle 方法根本不會被調用,因為 UINavigationController 中也有 preferredStatusBarStyle 這個方法。

解決辦法有兩個:

方法一: 設定導航欄的 barStyle 屬性會影響 status bar 的字型和背景色。如下。

@implementation MyNavigationController
- (UIStatusBarStyle)preferredStatusBarStyle {  
  UIViewController *topVC = self.topViewController;   
 return [topVC preferredStatusBarStyle];
}
@end
           

方法二: 自定義一個 UINavigationController 的子類,在這個子類中重寫 preferredStatusBarStyle 這個方法,這樣在 UIViewController 中就有效了,如下:

@implementation MyNavigationController
- (UIStatusBarStyle)preferredStatusBarStyle {  
  UIViewController *topVC = self.topViewController; 
   return [topVC preferredStatusBarStyle];
}
@end
           

**方法三:**全局設定UINavigationController的狀态欄,此方法同樣需要 Info.plist 檔案中添加 View controller-based status bar appearance 設定為 YES

-(void)viewWillAppear:(BOOL)animated{
  [super viewWillAppear:animated];

 [[[self navigationController] navigationBar] setBarStyle:UIBarStyleBlackTranslucent];
  [self setNeedsStatusBarAppearanceUpdate]; 
}

- (void)viewWillDisappear:(BOOL)animated{
  [super viewWillDisappear:animated];
 [[[self navigationController] navigationBar] setBarStyle:UIBarStyleDefault];
[self setNeedsStatusBarAppearanceUpdate];
}
           

2. 設定 Status Bar 的【背景部分】

背景部分,簡單來說,就是狀态欄的背景顔色,其實系統狀态欄的背景顔色一直是透明的狀态,當有導航欄時,導航欄背景是什麼顔色,狀态欄就是什麼顔色,沒有導航欄時,狀态欄背後的視圖時什麼顔色,它就是什麼顔色。

// 這個方法是設定導航欄背景顔色,狀态欄也會随之變色
[self.navigationController.navigationBar setBarTintColor:[UIColor redColor]];
           

如果想要單獨設定狀态欄顔色,可以添加以下方法來設定:

/** 設定狀态欄背景顔色 @param color 設定顔色 */
- (void)setStatusBarBackgroundColor:(UIColor *)color {   
 UIView *statusBar = [[[UIApplication sharedApplication] valueForKey:@"statusBarWindow"] valueForKey:@"statusBar"];  
  if ([statusBar respondsToSelector:@selector(setBackgroundColor:)]) {     
   statusBar.backgroundColor = color; 
   }
}
           

2人點贊

日記本

作者:片片碎

連結:https://www.jianshu.com/p/4166651dc64d

來源:簡書

著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。

繼續閱讀