http://www.jianshu.com/p/9f7f3fa624e7git
http://cocoa.venj.me/blog/view-controller-based-status-bar-style-and-uinavigationcontroller/github
http://www.jianshu.com/p/4196d7cf95f4api
設置app的狀態欄樣式的使用使用了舊的方式,在info.plist裏面設置了View controller-based status bar appearance爲NO,默認爲YES,通常式iOS6的時候使用這種方式,iOS7,8也兼容,可是到了iOS9就報了警告。wordpress
一. 在 info.plist 中,將 View controller-based status bar appearance 設爲 NO字體
狀態欄字體的顏色只由下面的屬性設定,默認爲白色:ui
解決個別 vc 中狀態欄字體顏色不一樣的辦法atom
一、在info.plist中,將View controller-based status bar appearance設爲NO.spa
二、在app delegate中:
[UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleLightContent;
三、在個別狀態欄字體顏色不同的vc中
-(void)viewWillAppear:(BOOL)animated{ [UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleDefault; } -(void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; [UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleLightContent; }
之前咱們經過上面代碼改變狀態了顏色,iOS9之後點進去看api發現以下說明
解決辦法:
修改方式將View controller-based status bar appearance設置爲YES,而後使用新的方式來實現狀態欄的樣式。
- (UIStatusBarStyle)preferredStatusBarStyle; - (UIViewController *)childViewControllerForStatusBarStyle; - (void)setNeedsStatusBarAppearanceUpdate
View controller-based status bar appearance的默認值就是YES。
若是View controller-based status bar appearance爲YES。
則[UIApplication sharedApplication].statusBarStyle 無效。
用下面的方法:
一、在vc中重寫vc的preferredStatusBarStyle方法。
-(UIStatusBarStyle)preferredStatusBarStyle { return UIStatusBarStyleDefault; }
二、在viewDidload中調用:[self setNeedsStatusBarAppearanceUpdate];
可是,當vc在nav中時,上面方法沒用 ,vc中的preferredStatusBarStyle方法根本不用被調用。
緣由是,[self setNeedsStatusBarAppearanceUpdate]發出後,
只會調用navigation controller中的preferredStatusBarStyle方法,
vc中的preferredStatusBarStyley方法跟本不會被調用。
解決辦法有兩個:
方法一:
設置navbar的barStyle 屬性會影響status bar 的字體和背景色。以下。
//status bar的字體爲白色
//導航欄的背景色是黑色。
self.navigationController.navigationBar.barStyle = UIBarStyleBlack;
//status bar的字體爲黑色
//導航欄的背景色是白色,狀態欄的背景色也是白色。
//self.navigationController.navigationBar.barStyle = UIBarStyleDefault;
方法二:
自定義一個nav bar的子類,在這個子類中重寫preferredStatusBarStyle方法:
Nav* nav = [[Nav alloc] initWithRootViewController:vc];
self.window.rootViewController = nav; @implementation Nav - (UIStatusBarStyle)preferredStatusBarStyle { UIViewController* topVC = self.topViewController; return [topVC preferredStatusBarStyle]; }
=======================
UINavigationController和View Controller-based狀態欄風格
JUL 24TH, 2014 10:30 AM
從iOS 7開始, UIViewController
有了一個新的方法:- preferredStatusBarStyle
,可讓用戶指定狀態欄風格。但問題是這個方法只有在ViewController
不包含在UINavigationController
中時才起做用。大部分狀況下,ViewController
不會單獨使用,通常都會嵌套在UINavigationController
中的。由於不知道這一點,因此在很長一段時間內,我都很困惑,明明我已經在個人ViewController
裏寫了- preferredStatusBarStyle
, 卻一點都不起做用。
知道了緣由,接下來就簡單了。咱們能夠寫一個UINavigationController
的擴展,覆蓋其默認實現,返回最上面的ViewController
的preferredStatusBarStyle
。
代碼以下:
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
//UINavigationController+StatusBar.h #import <UIKit/UIKit.h> @interface UINavigationController (StatusBar) - (UIStatusBarStyle)preferredStatusBarStyle; @end //UINavigationController+StatusBar.m #import "UINavigationController+StatusBar.h" @implementation UINavigationController (StatusBar) - (UIStatusBarStyle)preferredStatusBarStyle { return [[self topViewController] preferredStatusBarStyle]; } @end |
用Swift來寫:
1
2 3 4 5 |
extension UINavigationController { override public func preferredStatusBarStyle() -> UIStatusBarStyle { return self.topViewController.preferredStatusBarStyle() } } |
而後,在須要使用UINavigationController
的時候,引入UINavigationController+StatusBar.h
頭文件就能夠了。若是你用Swift,增長了extension
就完成了。
補充:
要使用View Controller Based Status Bar Style,你可能須要在項目的的Info.plist裏增長一條記錄:「View controller-based status bar appearance」,並將其值設置成YES
。
參考來源:Being Objective…
示例代碼(Swift):NavStatusStyle
(全文完)