先說下iOS9之前的方法
——————iOS9之前——————
全局隱藏狀態(tài)欄和設置樣式
1、在工程的info.plist文件中, 添加View controller-based status bar appearance
-->值為: NO
2、在AppDelegate中加上[[UIApplication sharedApplication] setStatusBarHidden:YES];
3.設置狀態(tài)欄樣式[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent/UIStatusBarStyleDefault];
@interface UIApplication(UIApplicationDeprecated)
// Setting statusBarHidden does nothing if your application is using the default UIViewController-based status bar system.
@property(readwrite, nonatomic,getter=isStatusBarHidden) BOOL statusBarHidden
NS_DEPRECATED_IOS(2_0, 9_0, "Use -[UIViewController prefersStatusBarHidden]") __TVOS_PROHIBITED;
- (void)setStatusBarHidden:(BOOL)hidden withAnimation:(UIStatusBarAnimation)animation
NS_DEPRECATED_IOS(3_2, 9_0, "Use -[UIViewController prefersStatusBarHidden]") __TVOS_PROHIBITED;
// Setting statusBarHidden does nothing if your application is using the default UIViewController-based status bar system.
這句注釋表明馅笙,如果使用視圖控制器去設置狀態(tài)欄狰域,UIApplication里的statusBarHidden方法不生效垂睬,setStatusBarStyle同理缠借。所以要View controller-based status bar appearance
-->值為:NO
某些頁面隱藏狀態(tài)欄和設置樣式
由于[UIApplication sharedApplication]是全局性的,只要設置過一次隱藏循未,所有頁面都是會隱藏狀態(tài)欄。如果你想要在某些頁面單獨設置隱藏狀態(tài)欄秫舌,先在AppDelegate中設置顯示狀態(tài)欄[[UIApplication sharedApplication] setStatusBarHidden:NO];
然后在某一個ViewController的viewWillAppear里設置隱藏的妖,再在viewWillDisappear里還原之前的設置。
狀態(tài)欄樣式同理足陨。
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
[[UIApplication sharedApplication] setStatusBarHidden:YES];
}
- (void)viewWillDisappear:(BOOL)animated{
[super viewWillDisappear:animated];
[[UIApplication sharedApplication] setStatusBarHidden:NO];
}
——————iOS9之后————————
iOS9之后上述的方法蘋果已經(jīng)不推薦使用了嫂粟,這些方法能用但是會報警告。注釋提示蘋果推薦使用Use -[UIViewController prefersStatusBarHidden]
這是iOS7之后蘋果在UIViewController里添加的新方法墨缘,這么做的目的可以讓開發(fā)者更加靈活的自定義每個ViewController的狀態(tài)欄星虹。
如果要使用prefersStatusBarHidden
方法,那么必須將View controller-based status bar appearance
-->值為: YES
飒房,并且setStatusBarHidden和setStatusBarStyle方法會失效
取而代之的是:
- (BOOL)preferredStatusBarHidden{
return YES;
}
- (UIStatusBarStyle)preferredStatusBarStyle{
return UIStatusBarStyleLightContent;
}
只要在UIViewController里重寫了這兩個方法搁凸,那么在ViewController顯示的時候狀態(tài)欄就會變成上面設置的樣式
全局隱藏狀態(tài)欄和設置樣式
改用[UIViewController prefersStatusBarHidden]方法設置狀態(tài)欄之后,APP運行后狠毯,應用不再讀取UIApplication 的statusBarHidden和statusBarStyle這兩個屬性去設置狀態(tài)欄护糖,而是根據(jù)AppDelegate.window.rootViewController
里的方法,這時首先會調(diào)用的是rootViewController中的childViewControllerForStatusBarHidden
函數(shù)嚼松,因為默認返回nil嫡良,那么接下來就會調(diào)用rootViewController本身的prefersStatusBarHidden
方法和preferredStatusBarStyle
方法。因此想要全局設置狀態(tài)欄献酗,只要在根視圖rootViewController里重寫這倆個方法即可寝受。
但是通常來說AppDelegate.window.rootViewController
都是UINavigationController,應用只會調(diào)用UINavigationController的方法罕偎,返回都是默認值很澄,所以已經(jīng)在自己的ViewController里寫了- preferredStatusBarHidden, 卻一點都不起作用。
當AppDelegate.window.rootViewController
是UINavigationController,想要全局設置狀態(tài)欄和樣式甩苛,可以在UINavigationController里重寫prefersStatusBarHidden
方法和preferredStatusBarStyle
方法即可
某些頁面隱藏狀態(tài)欄和設置樣式
當AppDelegate.window.rootViewController
是UINavigationController蹂楣,不能在UINavigationController里重寫prefersStatusBarHidden
方法和preferredStatusBarStyle
方法,而是自己創(chuàng)建一個繼承于UINavigationcontroller的NavigationController讯蒲,在這個子類中重寫childViewControllerForStatusBarHidden 和childViewControllerForStatusBarStyle函數(shù)
- (UIViewController *)childViewControllerForStatusBarHidden{
return self.topViewController;
}
- (UIViewController *)childViewControllerForStatusBarStyle{
return self.topViewController;
}
然后在每一個新的ViewController里根據(jù)需要重寫prefersStatusBarHidden
方法和preferredStatusBarStyle
方法
這樣每push或者pop一個vc痊土,狀態(tài)欄都是根據(jù)最上層的vcprefersStatusBarHidden
方法和preferredStatusBarStyle
方法去設置
setNeedsStatusBarAppearanceUpdate
UIViewController里的prefersStatusBarHidden方法和preferredStatusBarStyle方法,系統(tǒng)調(diào)用時機早于ViewController顯示時viewDidAppear墨林,因此只能決定ViewController顯示時的狀態(tài)欄赁酝,如果之后狀態(tài)欄發(fā)生變化,需要顯示的調(diào)用setNeedsStatusBarAppearanceUpdate
@property (nonatomic, assign) BOOL statusBarHidden;
- (BOOL)preferredStatusBarHidden{
return self.statusBarHidden;
}
- (void)needChangeStatusBarHidden {
self.statusBarHidden = YES;
[self setNeedsStatusBarAppearanceUpdate]; //立即更新狀態(tài)欄
}