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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用导航栏在模态视图中更改iOS 7中的UIStatusBarStyle?相关的知识,希望对你有一定的参考价值。

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的调用工作正常。但是,当酒吧可见时。

答案

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

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

另一答案

我们应该注意到非全屏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 。它可以帮助您解决这些类型的错误。

另一答案

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

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

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

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

navigationController?.navigationBar.barStyle = .Black // to make the status bar text white
另一答案

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

childViewControllerForStatusBarStyle

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

另一答案

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

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

另一答案

这对我有用:

  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

另一答案

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

另一答案

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

首先创建子类:

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之上,我发现这很方便。

以上是关于如何使用导航栏在模态视图中更改iOS 7中的UIStatusBarStyle?的主要内容,如果未能解决你的问题,请参考以下文章

ios7状态栏在模态视图上变回黑色? [复制]

模态视图导航栏的位置 - iOS7

如何更改模态视图 iOS 6 上的状态栏

iOS 11 中的 SafeArea:如何在没有安全区域的情况下使用自定义导航栏在主屏幕上添加来自 Objective-c 代码的视图

iOS 7导航栏在viewDidAppear上跳跃/拉伸

iOS 7 在 UINavigationController 中呈现模式视图?