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

Fra*_*kZp 11 statusbar modalviewcontroller ios ios7

iOS的7过渡指南提供一个很好的提示如何改变UIStatusBarStyle在动态UIViewController使用

- (UIStatusBarStyle)preferredStatusBarStyle {
     return UIStatusBarStyleDefault;
}
Run Code Online (Sandbox Code Playgroud)

和...一起 [self setNeedsStatusBarAppearanceUpdate];

这在单个视图应用程序中工作正常.但是,我现在正试图将UIStatusBarStyle模态视图更改为UIStatusBarStyleLightContent.有一个MainViewController分隔到ModalViewController,它本身嵌入在一个NavigationController.在ModalViewController已设置其委托的MainViewController.

我试着打电话给[self setNeedsStatusBarAppearanceUpdate];ModalViewController连同该类下面的方法不具效力:

// In ModalViewController.m
- (UIStatusBarStyle)preferredStatusBarStyle {
     return UIStatusBarStyleLightContent;
}
Run Code Online (Sandbox Code Playgroud)

我也试着打电话给[self setNeedsStatusBarAppearanceUpdate];MainViewControllerprepareForSegue: sender:与条件方法- (UIStatusBarStyle)preferredStatusBarStyle {}返回UIStatusBarStyleLightContent时模式的看法,提出-但是这并没有影响了.

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

编辑:发布更新:我需要提到的ModalViewController是嵌入在NavigationControllera中NavigationBar.随着NavigationBar设置为隐藏的上述呼吁[self setNeedsStatusBarAppearanceUpdate];ModalViewController精品工程.但是,当酒吧可见时.

小智 28

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

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


Put*_*tin 24

我们应该注意到非全屏modalVC CAN用于modalPresentationCapturesStatusBarAppearance控制statusBar样式.

任何想要了解更多有关状态栏控件的人都不应忽略UIViewController管理状态栏.

2015-11-06更新:

并确保您已UIViewControllerBasedStatusBarAppearanceiOS Keys中描述了设置

更新于2018.04.09:

我注意到navController中的viewController可能无法prefersStatusBarHidden通过iOS 10.0 - 10.2进行调用.自定义您的navigationController以确保

@implementation YourCustomNavController
//for iOS 10.0 - iOS 10.2
- (BOOL)prefersStatusBarHidden {
    UIViewController *childVC = [self childViewControllerForStatusBarHidden];
    if (childVC) {
        return [childVC prefersStatusBarHidden];
    }
    return [super prefersStatusBarHidden];
}
@end
Run Code Online (Sandbox Code Playgroud)

任何想要深入内部的人都可以+[UIViewController _currentStatusBarStyleViewController]使用Hopper或IDA Pro 挖掘UIKit .它可以帮助您解决这些类型的错误.


小智 11

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

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

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

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

@interface MyNavigationController : UINavigationController

@end

@implementation MyNavigationController

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

@end
Run Code Online (Sandbox Code Playgroud)


Ale*_*lly 6

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

navigationController?.navigationBar.barStyle = .Black // to make the status bar text white
Run Code Online (Sandbox Code Playgroud)

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