2013-09-25 21 views
11

iOS 7 Transition Guide提供一個很好的提示如何使用與[self setNeedsStatusBarAppearanceUpdate];如何使用導航欄在模態視圖中更改iOS 7中的UIStatusBarStyle?

這工作正常,在單個視圖應用

- (UIStatusBarStyle)preferredStatusBarStyle { 
    return UIStatusBarStyleDefault; 
} 

一起動態地更改UIStatusBarStyleUIViewController。但是,我現在試圖將模式視圖中的UIStatusBarStyle更改爲UIStatusBarStyleLightContent。有一個MainViewController,它轉入ModalViewController,它本身嵌入在NavigationController中。 ModalViewController已將其代表設置爲MainViewController

我試着打在ModalViewController與該類下面的方法一起[self setNeedsStatusBarAppearanceUpdate];無效果:

// In ModalViewController.m 
- (UIStatusBarStyle)preferredStatusBarStyle { 
    return UIStatusBarStyleLightContent; 
} 

我也試着撥打[self setNeedsStatusBarAppearanceUpdate];MainViewControllerprepareForSegue: sender:方法與- (UIStatusBarStyle)preferredStatusBarStyle {}條件返回UIStatusBarStyleLightContent當模態視圖呈現 - 但也沒有效果。

如何更改模態視圖中的UIStatusBarStyle?

編輯:後更新:我需要提及的是,ModalViewController嵌入在NavigationControllerNavigationBar。用NavigationBar設置爲隱藏到[self setNeedsStatusBarAppearanceUpdate];的上方呼叫ModalViewController工作正常。但是,當酒吧可見時不會。

+0

你在ModalViewController實現中調用了[self setNeedsStatusBarAppearanceUpdate]的位置? – Moxy

+0

'viewDidLoad'方法 – FrankZp

+0

在'-viewWillAppear:'中怎麼樣? – Moxy

回答

27

您需要一個顯示在Fullscreen中的ViewController來返回適當的狀態欄信息。在你的情況:包含ModalViewController的NavigationController需要實現preferredStatusBarStyle並返回UIStatusBarStyleLightContent

只有在視圖控制器返回的值實際發生更改時才需要調用setNeedsStatusBarAppearanceUpdate。當視圖控制器首次出現時,無論如何都會查詢它們。

+0

你爲我節省了一大堆時間。 iOS 7應用程序也需要支持iOS 6,可操作性差。謝謝一堆! – Craimasjien

+1

如何在我的AppDelegate中實現preferredStatusBarStyle?我有一個TabBarViewController導致導致UIViewControllers的4個NavControllers,我應該在Tab Bar中嘗試這個類嗎?在Navcontrollers?或在AppDelegate? - 我需要所有狀態欄設置爲LightContent – Chisx

+0

在你的情況下,它可能是一個TabBarViewController的子類,它必須實現'preferredStatusBarStyle' – jaetzold

1

它看起來像應用程序關閉最頂層的viewController的statusBarStyle。因此,如果您在當前視圖之上添加另一個viewController,它現在會從新的viewController中獲取它的提示。

11

使這項工作的關鍵是隻有全屏視圖控制器才能指定狀態欄的樣式。

如果您正在使用導航控制器並希望以每個視圖控制器爲基礎控制狀態欄,那麼您需要繼承UINavigationController並實現preferredStatusBarStyle,以便返回topViewController的首選項。

請確保您將故事板場景中的類引用從UAVavigationController更改爲您的子類(例如下面的示例中的MyNavigationController)。如果你的應用程序是基於TabBar的,你會想通過繼承UITabBarController來做類似的事情,但我沒有嘗試過)。

@interface MyNavigationController : UINavigationController 

@end 

@implementation MyNavigationController 

- (UIStatusBarStyle)preferredStatusBarStyle 
{ 
    return self.topViewController.preferredStatusBarStyle; 
} 

@end 
+0

UINavigationController子類很好,謝謝!我也做了一個類別的快速實驗。它實際上和子類一樣工作。 –

2

我有一個菜單/顯示控制器(SWRevealController),它始終是狀態欄查詢的根控制器。覆蓋childViewControllerForStatusBarStyle讓我將查詢重新路由到最前面的控制器。

/** 
This view is always considered the topmost for status bar color queries. 
Pass the query along to what we're showing in front. 
*/ 
- (UIViewController *)childViewControllerForStatusBarStyle 
{ 
    UIViewController *front = self.frontViewController; 
    if ([front isKindOfClass:[UINavigationController class]]) 
     return ((UINavigationController*)front).topViewController; 
    else 
     return front; 
} 
0

只要看看了,如果你的應用程序的RootViewController的需要重寫 - (UIStatusBarStyle)preferredStatusBarStyle方法

0

上述所有工作。然而有時候我發現它真的是一個痛苦的底部去改變故事板中的每一個實例等...所以這裏有一些對我來說也適用,也涉及到子類。

首先創建子類:

@interface HHNavLightColorBarController : UINavigationController 

@end 

@implementation HHNavLightColorBarController 

- (UIStatusBarStyle)preferredStatusBarStyle { 
    return UIStatusBarStyleLightContent; 
} 
@end 

然後使用Objective-C的神奇和一點點的<objc/runtime.h>

當你有視圖控制器的參考並提交它:

UINavigationController *navVC = ...; // Init in your usual way 
object_setClass(navVC, [HHNavLightColorBarController class]); 
[self presentViewController:nav animated:YES completion:^{ 
    NSLog(@"Launch Modal View Controller"); 
}]; 

有時似乎有點不那麼侵入性。你甚至可以創建一個類別來檢查你的kindOfClass是否是一個導航控制器,並自動爲你做。無論如何,答案是由上述jaetzold,我只是發現這很方便。

23

我們應該注意到,非全屏modalVC CAN使用modalPresentationCapturesStatusBarAppearance來控制statusBar風格。

任何想知道更多關於狀態欄控件的人都不應忽視UIViewController Managing the Status Bar

更新於2015年11月6日:

並確保您已設置在iOS Keys

+4

這應該是公認的答案 – Raphael

+0

完美,這正是我面臨的問題,一個自定義的VC並沒有改變狀態欄的外觀,並且前一個視圖仍然在被查詢。 – Guykun

1

這說明UIViewControllerBasedStatusBarAppearance工作對我來說:

  1. 設置View controller-based status bar appearanceNO
  2. 將狀態欄樣式設置爲UIStatusBarStyleLightContent(只需複製該值)
  3. 在的appDelegate使用[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];

希望它可以幫助(參考:ios7 status bar changing back to black on modal views?

4

要改變的UINavigationController的嵌入你的ViewController狀態欄沒有子的UINavigationController,使用此:

navigationController?.navigationBar.barStyle = .Black // to make the status bar text white 

。黑色將使文本變白(狀態欄和視圖的標題),而.Default有黑色標題和狀態欄。