狀態(tài)欄隱藏
-
通過Info.plist控制
(1) 在
View controller-based status bar appearance
(Info.plist) -> NO(2) 在
Status bar is initially hidden
(Info.plist) -> YES/NO. 或者 Target -> General -> Hide status bar -
通過代碼控制
在
View controller-based status bar appearance
(Info.plist)YES
-> 則控制器對狀態(tài)欄設(shè)置的優(yōu)先級高于application
->UIViewController prefersStatusBarHidden
NO
-> 則-以application
為準(zhǔn)嘹黔, 控制器設(shè)置狀態(tài)欄無效 ->[[UIApplication sharedApplication] setStatusBarHidden:YES]
狀態(tài)欄設(shè)置
在 View controller-based status bar appearance
(Info.plist)
YES
-> 則控制器對狀態(tài)欄設(shè)置的優(yōu)先級高于application
-> UIViewController preferredStatusBarStyle
NO
-> 則-以application
為準(zhǔn)诱贿, 控制器設(shè)置狀態(tài)欄無效 -> [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent]
1.通過UIApplication
前提 在 View controller-based status bar appearance
(Info.plist) -> NO
iOS9之后已棄用 不推薦
[[UIApplicationsharedApplication] setStatusBarHidden:YES];
[[UIApplicationsharedApplication] setStatusBarHidden:YESanimated:YES];
?
[[UIApplicationsharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
[[UIApplicationsharedApplication] setStatusBarStyle:UIStatusBarStyleLightContentanimated:YES];
2.通過UIViewController
前提 在 View controller-based status bar appearance
(Info.plist) -> YES
iOS7之后添加的方法 推薦使用
- (void)setNeedsStatusBarAppearcanceUpdate;
- (UIStatusBarStyle)preferredStatusBarSytle;
- (UIViewController *)childViewControllerForStatusBarStyle;
- (BOOL)prefersStatusBarHidden;</pre>
0x01 setNeedsStatusBarApearanceUpdate()
當(dāng)我們調(diào)用
setNeedsStatusBarApearanceUpdate()
時,系統(tǒng)會調(diào)用application.window
的rootViewController
的preferredStatusBarStyle
方法如果在
UIViewController
已經(jīng)顯示无午,這時還要在當(dāng)前頁面不時的更改statusBar
的前景色,那么祝谚,你首先需要調(diào)用setNeedsStatusBarApearanceUpdate()
,這個和UIView
的setNeedsDisplay
差不多
0x02 (UIStatusBarStyle)preferredStatusBarSytle
在你自己的 UIViewController
里重寫此方法宪迟,返回 UIStatusBarStyleDefault
或者 UIStatusBarStyleLightContent
這里如果你只是簡單
return
一個固定的值,那么該UIViewController
顯示的時候交惯,程序就會馬上調(diào)用該方法次泽,來改變statusBar的外觀這里有個常見的問題重寫
preferredStatusBarSytle
不調(diào)用不生效,因為這個只有在UIViewController
單獨(dú)使用才會生效席爽,但是我們大部分情況下意荤,ViewController
都會嵌套在UINavigationController
中,解決辦法也可以子類化UINavigationController,重寫preferredStatusBarStyle
//HHNavigationController.h
#import <UIKit/UIKit.h>
@interfaceHHNavigationController: UINavigationController
@end
?
@implementationHHNavigationController
?
-(UIStatusBarStyle)preferredStatusBarStyle{
return self.topViewController.preferredStatusBarStyle;
}
?
@end
0x03 (UIViewController *)childViewControllerForStatusBarStyle
默認(rèn)返回值為nil.
0x01上面說了,當(dāng)我們調(diào)用
setNeedsStatusBarApearanceUpdate()
時只锻,系統(tǒng)會調(diào)用application.window
的rootViewController
的preferredStatusBarStyle
方法玖像,如果這個rootViewController
是UINavigationController
,那我們自己的UIViewController
里的preferredStatusBarStyle
根本不會調(diào)用,這也是0x02提到的原因解決0x02
(UIStatusBarStyle)preferredStatusBarSytle
不調(diào)用齐饮,也可以子類化UINavigationController,重寫childViewControllerForStatusBarStyle
//HHNavigationController.h
#import <UIKit/UIKit.h>
@interfaceHHNavigationController: UINavigationController
@end
?
@implementationHHNavigationController
?
-(UIViewController*)childViewControllerForStatusBarStyle{
return self.topViewController;
}
?
@end
0x04 (BOOL)prefersStatusBarHidden
返回YES/NO來這是狀態(tài)欄的隱藏/顯示,用法與preferredStatusBarSytle
一致
總結(jié)
經(jīng)過代碼實(shí)踐 捐寥,Demo在這里
經(jīng)過測試 如果Info.plist
View controller-based status bar appearance
不設(shè)置,默認(rèn)為YES
加上舍棄棄用方法祖驱,我們只需要遵循
子類化一個UINavigationController
的類握恳,重寫
-(UIViewController*)childViewControllerForStatusBarHidden{
return self.topViewController;
}
?
-(UIViewController*)childViewControllerForStatusBarStyle{
return self.topViewController;
}
即可達(dá)到每個頁面可以控制狀態(tài)欄的效果
參考
談一談iOS開發(fā)中info.plist中的View controller-based status bar appearance屬性