如何使用导航栏在模态视图中更改iOS 7中的UIStatusBarStyle?

问题描述 投票:11回答:9

iOS 7 Transition Guide提供了一个很好的提示如何在UIStatusBarStyle中动态更改UIViewController

- (UIStatusBarStyle)preferredStatusBarStyle {
     return UIStatusBarStyleDefault;
}

[self setNeedsStatusBarAppearanceUpdate];一起

这在单个视图应用程序中工作正常。但是,我现在正试图将模态视图中的UIStatusBarStyle更改为UIStatusBarStyleLightContent。有一个MainViewController位于ModalViewController,它本身嵌入NavigationControllerModalViewController已将其代表设置为MainViewController

我试图在[self setNeedsStatusBarAppearanceUpdate];中调用ModalViewController以及该类中的以下方法而没有效果:

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

我还尝试在[self setNeedsStatusBarAppearanceUpdate];方法中使用MainViewController调用prepareForSegue: sender:,在- (UIStatusBarStyle)preferredStatusBarStyle {}中使用UIStatusBarStyleLightContent时返回ModalViewController,但是这也没有效果。

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

编辑:发布更新:我需要提到的是,NavigationController嵌入在带有NavigationBarNavigationBar中。随着[self setNeedsStatusBarAppearanceUpdate];被设置隐藏到ModalViewController上面的preferredStatusBarStyle的调用工作正常。但是,当酒吧可见时。

ios ios7 modalviewcontroller statusbar
9个回答
28
投票

您需要一个在Fullscreen中显示的ViewController才能返回相应的状态栏信息。在你的情况下:包含ModalViewController的NavigationController需要实现UIStatusBarStyleLightContent并返回setNeedsStatusBarAppearanceUpdate

只有在视图控制器返回的值实际发生更改时,才需要调用modalPresentationCapturesStatusBarAppearance。首次显示视图控制器时,无论如何都会查询它们。


24
投票

我们应该注意到非全屏modalVC CAN使用UIViewController Managing the Status Bar来控制statusBar样式。

任何想要了解更多关于状态栏控件的人都不应该忽略UIViewControllerBasedStatusBarAppearance

2015-11-06更新:

并确保你设置iOS Keys中描述的prefersStatusBarHidden

更新于2018.04.09:

我注意到navController中的viewController可能无法使用iOS 10.0 - 10.2调用@implementation YourCustomNavController //for iOS 10.0 - iOS 10.2 - (BOOL)prefersStatusBarHidden { UIViewController *childVC = [self childViewControllerForStatusBarHidden]; if (childVC) { return [childVC prefersStatusBarHidden]; } return [super prefersStatusBarHidden]; } @end 。自定义您的navigationController以确保

+[UIViewController _currentStatusBarStyleViewController]

任何想要深入内部的人都可以使用Hopper或IDA Pro挖掘UIKit @interface MyNavigationController : UINavigationController @end @implementation MyNavigationController - (UIStatusBarStyle)preferredStatusBarStyle { return self.topViewController.preferredStatusBarStyle; } @end 。它可以帮助您解决这些类型的错误。


11
投票

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

如果您正在使用导航控制器并希望在每个视图控制器的基础上控制状态栏,您将需要子类UINavigationController并实现preferredStatusBarStyle,以便它返回topViewController的首选项。

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

(以下适用于我。如果您的应用程序是基于TabBar的,您将希望通过继承UITabBarController来做类似的事情,但我还没有尝试过)。

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

6
投票

要更改嵌入ViewController的UINavigationController的状态栏而不继承UINavigationController,请使用以下命令:

childViewControllerForStatusBarStyle

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


2
投票

我有一个侧面菜单/显示控制器(SWRevealController),它总是成为状态栏查询的根控制器。覆盖/** 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; } 让我将查询重新路由到最前面的控制器。

View controller-based status bar appearance

1
投票

看起来应用程序关闭了最顶层viewController的statusBarStyle。因此,如果您在当前的视图上添加另一个viewController,它现在可以从新的viewController获取它的提示。


1
投票

这对我有用:

  1. NO设为UIStatusBarStyleLightContent
  2. 将状态栏样式设置为[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];(只需复制该值)
  3. 在appDelegate中使用ios7 status bar changing back to black on modal views?

希望它有所帮助(参考:@interface HHNavLightColorBarController : UINavigationController @end @implementation HHNavLightColorBarController - (UIStatusBarStyle)preferredStatusBarStyle { return UIStatusBarStyleLightContent; } @end


0
投票

如果您的应用程序的rootViewController需要覆盖 - (UIStatusBarStyle)preferredStatusBarStyle方法,请查看


0
投票

所有上述工作。然而,有时我发现在故事板中改变每个实例的底部真的很痛苦......所以这里的东西对我来说也适用于子类化。

首先创建子类:

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

然后使用Objective-C的魔力和一点<objc / runtime.h>

当您有视图控制器的引用并且您呈现它时:

qazxswpoi

有时似乎有点不太干扰。您甚至可以创建一个类别来检查您的kindOfClass是否为导航控制器并自动为您执行此操作。无论如何,答案在jaetzold之上,我发现这很方便。

© www.soinside.com 2019 - 2024. All rights reserved.