總結:
- 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隐藏
image.png
image.png
-
View controller-based status bar appearance
設定為 NO這個是隐藏 App 在
所有
UIViewController 時的狀态欄。【當然同時要項目勾選Hide status bar,這個沒有勾選,也不會隐藏】
除了LunchScreen的開啟頁面不隐藏,其他頁面全部隐藏
image.png 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 狀态欄的顔色
狀态欄分前後兩部分,要厘清這兩個概念,後面會用到:
- 文字部分:就是指的顯示電池、時間等部分。
- 背景部分:就是顯示黑色或者圖檔的背景部分。
image
文字部分為白色,背景部分為黑色
1. 設定 Status Bar 的【文字部分】
簡單來說,就是設定顯示電池電量、時間、網絡部分标示的顔色, 這裡隻能設定兩種顔色:
// 預設的黑色
UIStatusBarStyleDefault
// 白色
UIStatusBarStyleLightContent
1)通過設定 Info.plist 檔案全局設定狀态欄的文字顔色
- 在 Info.plist 裡增加一行 UIStatusBarStyle( Status bar style 也可以),這裡可以設定兩個值,就是上面提到那兩個 UIStatusBarStyleDefault 和 UIStatusBarStyleLightContent 。
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
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。