我們先來說一下相關(guān)的數(shù)據(jù)
View controller-based status bar appearance
在項(xiàng)目的info.plist文件里的View controller-based status bar appearance為BOOL型,默認(rèn)為YES贷帮。
當(dāng)為yes的時(shí)候关贵,VC對(duì)status bar的屬性設(shè)置的優(yōu)先級(jí)高于app,可以在各個(gè)UIViewController中控制控制狀態(tài)欄的顏色和狀態(tài)恒削;當(dāng)為NO的時(shí)候,APP對(duì)status bar的屬性設(shè)置的優(yōu)先級(jí)高于VC尾序,全局設(shè)置status tar的顏色和狀態(tài)钓丰,VC設(shè)置狀態(tài)欄preferStatusBarHidden是無效的根本不會(huì)被調(diào)用。
方法一(IOS9.0+之后不建議使用每币,可能會(huì)有警告)
設(shè)置
將info.plist中的View controller-based status bar appearance設(shè)置為NO(若沒有這個(gè)key,直接插入再設(shè)置為NO)携丁,否。
[[UIApplication sharedApplication]setStatusBarStyle:UIStatusBarStyleLightContent];
我們點(diǎn)進(jìn)去看api的時(shí)候發(fā)現(xiàn)如下說明
// Setting the statusBarStyle does nothing if your application is using
//the default UIViewController-based status bar system.
@property(readwrite,nonatomic)UIStatusBarStyle statusBarStyle
NS_DEPRECATED_IOS(2_0,9_0,"Use -[UIViewController preferredStatusBarStyle]");
- (void)setStatusBarStyle:(UIStatusBarStyle)statusBarStyle animated:(BOOL)animated
NS_DEPRECATED_IOS(2_0,9_0,"Use -[UIViewController preferredStatusBarStyle]");
方法二
設(shè)置
將info.plist中的View controller-based status bar appearance設(shè)置為YES兰怠,默認(rèn)值就是YES;如果plist中沒有這個(gè)key,該方式亦可生效梦鉴。
實(shí)現(xiàn)方法
preferredStatusBarStyle
- (UIStatusBarStyle)preferredStatusBarStyle
在需要的控制器里面重寫這個(gè)方法李茫,返回值就是UIStatusBarStyleDefault、UIStatusBarStyleLightContent或者UIStatusBarStyleDarkContent肥橙。
childViewControllerForStatusBarStyle
- (UIViewController *)childViewControllerForStatusBarStyle:
If your container view controller derives its status bar style from one of its child view controllers, implement this method and return that child view controller. If you return
nil
or do not override this method, the status bar style forself
is used.
我們可以給UINavigationController以及UITabBarController寫一個(gè)catogory,implementation如下:
//
@implementation UINavigationController (OLStatusBarStyle)
- (UIViewController *)childViewControllerForStatusBarStyle{
return self.topViewController;
}
- (UIViewController *)childViewControllerForStatusBarHidden{
return self.topViewController;
}
@implementation UITabBarController (OLStatusBarStyle)
- (UIViewController *)childViewControllerForStatusBarStyle{
return self.selectedViewController;
}
- (UIViewController *)childViewControllerForStatusBarHidden{
return self.selectedViewController;
}
擴(kuò)展中重寫了這兩個(gè)方法魄宏,意味著不再調(diào)用container(NavigationController或者UITabBarController)的preferredStatusBarStyle這個(gè)方法,而是調(diào)用self.topViewController/ self.selectedViewControlle的preferredStatusBarStyle,那么我們重寫的preferredStatusBarStyle就會(huì)被調(diào)用存筏,就能更改status bar的顏色了娜庇。
只要UIViewController重寫的childViewControllerForStatusBarStyle返回值不是nil,那么UIViewcontroller的preferredStatusBarStyle方法不會(huì)被系統(tǒng)的Container(NavigationController或者UITabBarController)調(diào)用方篮,而是調(diào)用childViewControllerForStatusBarStyle返回的UIViewController的preferredStatusBarStyle來控制StatuBar的顏色名秀。