相關(guān)的理論知識
狀態(tài)欄前景顏色種類
- 默認的黑色(UIStatusBarStyleDefault)
- 白色(UIStatusBarStyleLightContent)
狀態(tài)欄前景顏色設置的地方有兩個:plist設置 和 代碼設置
1.plist里面設置:
1.Targets=>General=>Deployment Info
這里可以設置啟動圖的狀態(tài)欄是否顯示及其顏色
2.Targets=>Info=>View controller-based status bar appearance
YES捺檬,
則控制器對狀態(tài)欄設置的優(yōu)先級高于
[[UIApplication sharedApplication] setStatusBarStyle:<#UIStatusBarStyle#>];
NO,
則以 [[UIApplication sharedApplication] setStatusBarStyle:<#UIStatusBarStyle#>];
為準
2.代碼設置
UIViewController有四個相關(guān)的函數(shù)
- (UIStatusBarStyle)preferredStatusBarStyle;
- (BOOL)prefersStatusBarHidden;
- (void)setNeedsStatusBarAppearanceUpdate;
- (UIViewController *)childViewControllerForStatusBarStyle;
-(BOOL)prefersStatusBarHidden;
在UIViewController里重寫此方法,可以定制某個 控制器 對應的狀態(tài)欄是否隱藏-(UIStatusBarStyle)preferredStatusBarStyle;
在UIViewController里重寫此方法偏化,可以定制某個 控制器 對應的狀態(tài)欄前景顏色-(void)setNeedsStatusBarAppearanceUpdate;
如果UIViewController已經(jīng)在顯示,你還要更改statusBar的前景色断傲,那么救赐,你首先需要調(diào)用下面的setNeedsStatusBarAppearanceUpdate方法(這個方法會通知系統(tǒng)去調(diào)用當前UIViewController的preferredStatusBarStyle方法-(UIViewController *)childViewControllerForStatusBarStyle;
我們的程序里一般都是用UINavigationController做root,如果是這種情況簇抵,那我們自己的UIViewController里的preferredStatusBarStyle根本不會被調(diào)用。
這種情況下childViewControllerForStatusBarStyle就派上用場了妻味,我們要子類化一個UINavigationController正压,在這個子類里面重寫childViewControllerForStatusBarStyle方法,如下:
- (UIViewController *)childViewControllerForStatusBarStyle{
return self.topViewController;
}
意思是责球,不要調(diào)用UINavigationController的preferredStatusBarStyle方法焦履,而是去調(diào)用navigationController.topViewController的preferredStatusBarStyle方法拓劝,這樣就能讓當前顯示的UIViewController的preferredStatusBarStyle方法能影響statusBar的樣式
我的實踐
-
設置啟動頁狀態(tài)欄
Targets=>General=>Deployment Info 在這里設置狀態(tài)欄是否顯示及其樣式
-
設置控制器優(yōu)先于Application
Targets=>Info=>View controller-based status bar appearance 設置為YES
-
讓當前顯示的UIViewController能控制狀態(tài)欄的樣式
BaseNavigationController 繼承自 UINavigationController, 重寫childViewControllerForStatusBarStyle方法嘉裤,如下:
- (UIViewController *)childViewControllerForStatusBarStyle { return self.topViewController; }
-
在BaseViewController里面設置該App的主題狀態(tài)欄樣式
- (UIStatusBarStyle)preferredStatusBarStyle { return <#UIStatusBarStyle#>; }
-
在需要定制化狀態(tài)欄樣式的SomeoneViewController里設置特定的狀態(tài)欄樣式
- (UIStatusBarStyle)preferredStatusBarStyle { return <#UIStatusBarStyle#>; }