3 回答
TA貢獻1784條經驗 獲得超2個贊
可能的根本原因
我遇到了同樣的問題,并且發現它正在發生,因為我沒有在我的應用程序窗口中設置根視圖控制器。
的UIViewController,其中我已經實現的preferredStatusBarStyle是在一個使用UITabBarController,其控制的屏幕上的意見的外觀。
當我將根視圖控制器設置為指向此時UITabBarController,狀態欄更改開始按預期正常工作(并且該preferredStatusBarStyle方法被調用)。
(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{
... // other view controller loading/setup code
self.window.rootViewController = rootTabBarController;
[self.window makeKeyAndVisible];
return YES;}替代方法(在iOS 9中已棄用)
或者,您可以根據需要在每個視圖控制器中調用以下方法之一,具體取決于其背景顏色,而不必使用setNeedsStatusBarAppearanceUpdate:
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
要么
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefault];
請注意,您還需要設置UIViewControllerBasedStatusBarAppearance到NO如果您使用此方法在plist文件。
TA貢獻1834條經驗 獲得超8個贊
對于使用UINavigationController的任何人:
該UINavigationController不上轉發該preferredStatusBarStyle呼叫到其子視圖控制器。相反,它管理自己的狀態 - 正如它應該的那樣,它繪制在狀態欄所在的屏幕頂部,因此應該負責它。因此preferredStatusBarStyle,在導航控制器內的VC中實現將不會做任何事情 - 它們永遠不會被調用。
訣竅在于UINavigationController決定返回什么UIStatusBarStyleDefault或者用途的用途UIStatusBarStyleLightContent。它以此為基礎UINavigationBar.barStyle。默認(UIBarStyleDefault)會生成暗前景UIStatusBarStyleDefault狀態欄。并UIBarStyleBlack會給出一個UIStatusBarStyleLightContent狀態欄。
如果你想UIStatusBarStyleLightContent在UINavigationController使用:
self.navigationController.navigationBar.barStyle = UIBarStyleBlack;
TA貢獻1111條經驗 獲得超0個贊
所以我實際上為UINavigationController添加了一個類別,但使用了這些方法:
-(UIViewController *)childViewControllerForStatusBarStyle;-(UIViewController *)childViewControllerForStatusBarHidden;
并讓那些返回當前可見的UIViewController。這使得當前可見視圖控制器設置其自己的首選樣式/可見性。
這是一個完整的代碼片段:
在Swift中:
extension UINavigationController {
public override func childViewControllerForStatusBarHidden() -> UIViewController? {
return self.topViewController }
public override func childViewControllerForStatusBarStyle() -> UIViewController? {
return self.topViewController }}在Objective-C中:
@interface UINavigationController (StatusBarStyle)@end@implementation UINavigationController (StatusBarStyle)-(UIViewController *)childViewControllerForStatusBarStyle {
return self.topViewController;}-(UIViewController *)childViewControllerForStatusBarHidden {
return self.topViewController;}@end為了更好的衡量,以下是它在UIViewController中的實現方式:
在斯威夫特
override public func preferredStatusBarStyle() -> UIStatusBarStyle {
return .LightContent}override func prefersStatusBarHidden() -> Bool {
return false}在Objective-C中
-(UIStatusBarStyle)preferredStatusBarStyle {
return UIStatusBarStyleLightContent; // your own style}- (BOOL)prefersStatusBarHidden {
return NO; // your own visibility code}最后,確保你的應用程序plist中不具有“查看基于控制器的狀態欄外觀”設置為NO。刪除該行或將其設置為YES(我認為現在是iOS 7的默認值?)
- 3 回答
- 0 關注
- 1435 瀏覽
添加回答
舉報
