http://www.jianshu.com/p/9f7f3fa624e7
http://cocoa.venj.me/blog/view-controller-based-status-bar-style-and-uinavigationcontroller/
http://www.jianshu.com/p/4196d7cf95f4
-
狀態欄的字體為黑色: UIStatusBarStyleDefault
-
狀態欄的字體為白色: UIStatusBarStyleLightContent
設置app的狀態欄樣式的使用使用了舊的方式,在info.plist里面設置了View controller-based status bar appearance為NO,默認為YES,一般式iOS6的時候使用這種方式,iOS7,8也兼容,但是到了iOS9就報了警告。
一. 在 info.plist 中,將 View controller-based status bar appearance 設為 NO
狀態欄字體的顏色只由下面的屬性設定,默認為白色:
// default is UIStatusBarStyleDefault [UIApplication sharedApplication].statusBarStyle
解決個別 vc 中狀態欄字體顏色不同的辦法
1、在info.plist中,將View controller-based status bar appearance設為NO.
2、在app delegate中:
[UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleLightContent;
3、在個別狀態欄字體顏色不一樣的vc中
-(void)viewWillAppear:(BOOL)animated{ [UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleDefault; } -(void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; [UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleLightContent; }
以前我們通過上面代碼改變狀態了顏色,iOS9以后點進去看api發現如下說明
// 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]");
解決辦法:
修改方式將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 無效。
用下面的方法:
1、在vc中重寫vc的preferredStatusBarStyle方法。
-(UIStatusBarStyle)preferredStatusBarStyle { return UIStatusBarStyleDefault; }
2、在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狀態欄風格
從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 |
|
用Swift來寫:
1
2 3 4 5 |
|
然后,在需要使用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
(全文完)