如何更改模式视图iOS 7中的UIStatusBarStyle导航栏?

iOS 7过渡指南给出了一个很好的提示,如何在UIViewControllerdynamic地改变UIStatusBarStyle

 - (UIStatusBarStyle)preferredStatusBarStyle { return UIStatusBarStyleDefault; } 

连同[self setNeedsStatusBarAppearanceUpdate];

这在单个视图应用程序中正常工作。 但是,我现在试图将模式视图中的UIStatusBarStyleLightContent更改为UIStatusBarStyleLightContent 。 有一个MainViewControllerinheritance了ModalViewController ,它本身embedded在NavigationControllerModalViewController已将其委托设置为MainViewController

我试图调用[self setNeedsStatusBarAppearanceUpdate];ModalViewController与下面的方法一起在该类中无效:

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

我也尝试调用[self setNeedsStatusBarAppearanceUpdate];MainViewControllerprepareForSegue: sender:方法的条件在- (UIStatusBarStyle)preferredStatusBarStyle {}返回UIStatusBarStyleLightContent时,模态视图呈现 – 但也没有效果。

如何在模态视图中更改UIStatusBarStyle?

编辑:发布更新:我需要提到的是, ModalViewController是embeddedNavigationController NavigationBar 。 将NavigationBar设置为隐藏到[self setNeedsStatusBarAppearanceUpdate];上面调用[self setNeedsStatusBarAppearanceUpdate];ModalViewController工作正常。 但是,当酒吧是可见的。

你需要一个全屏显示的ViewController来返回适当的状态栏信息。 你的情况:包含ModalViewController的NavigationController需要实现preferredStatusBarStyle并返回UIStatusBarStyleLightContent

仅当视图控制器返回的值实际发生更改时,才需要调用setNeedsStatusBarAppearanceUpdate 。 当视图控制器首先被呈现时,无论如何都会被查询。

我们应该注意到,非全屏modalVC可以使用modalPresentationCapturesStatusBarAppearance来控制statusBar风格。

任何想了解状态栏控件的人都不应该忽略UIViewControllerpipe理状态栏 。

2015-11-06更新:

并确保你已经设置了iOS密钥中描述的UIViewControllerBasedStatusBarAppearance

使这项工作的关键是只有全屏视图控制器才能指定状态栏的样式。

如果您使用的是导航控制器,并且想要以每个视图控制器为基础控制状态栏,那么您需要inheritanceUINavigationController并实现preferredStatusBarStyle,以便返回topViewController的首选项。

确保将你的故事板场景中的类引用从UINavigationController更改为你的子类(例如下面的示例中的MyNavigationController)。

(下面的例子适用于我,如果你的应用程序是基于TabBar的,你可能想通过inheritanceUITabBarController来做类似的事情,但是我没有试过)。

 @interface MyNavigationController : UINavigationController @end @implementation MyNavigationController - (UIStatusBarStyle)preferredStatusBarStyle { return self.topViewController.preferredStatusBarStyle; } @end 

要改变UINavigationController的状态栏,embedded你的ViewController而不需要inheritanceUINavigationController,使用这个:

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

.Black将使文本变白(状态栏和视图的标题),而.Default有一个黑色的标题和状态栏。

我有一个侧面菜单/显示控制器(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; } 

看起来应用程序closures最顶层的viewController的statusBarStyle。 所以,如果你在当前的视图上添加另一个viewController,它现在从新的viewController获取它的提示。

这适用于我:

  1. View controller-based status bar appearanceNO
  2. 将状态栏样式UIStatusBarStyleLightContentUIStatusBarStyleLightContent (只需复制该值)
  3. 在appDelegate中使用[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];

希望它有帮助(参考: 在状态视图上,ios7状态栏变回黑色? )

只要看看你的应用程序的rootViewController是否需要重写 – (UIStatusBarStyle)preferredStatusBarStyle方法

以上所有的工作。 然而有时候我发现它真的是一个痛苦的底部去改变故事板等每一个实例…所以这里有一些适合我的东西,也涉及到子类。

首先创build子类:

 @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"); }]; 

有时似乎有点侵入性。 你甚至可以创build一个类别,检查你的kindOfClass是否是一个导航控制器,并自动为你做。 无论如何,答案是由jaetzold上面,我只是发现这是方便的。