代码之家  ›  专栏  ›  技术社区  ›  FrankZp

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

  •  11
  • FrankZp  · 技术社区  · 11 年前

    这个 iOS 7 Transition Guide 给出一个很好的提示如何更改 UIStatusBarStyle 在中动态 UIViewController 使用

    - (UIStatusBarStyle)preferredStatusBarStyle {
         return UIStatusBarStyleDefault;
    }
    

    [self setNeedsStatusBarAppearanceUpdate];

    这在单视图应用程序中运行良好。然而,我现在正试图改变 UIS状态条形图样式 在模态视图中 UIStatusBarStyleLightContent 。有一个 MainViewController 哪个分段到 ModalViewController ,其本身嵌入 NavigationController 这个 模式视图控制器 已将其委托设置为 主视图控制器 .

    我试着打电话 [self-setNeedsStatus条形外观更新]; 模式视图控制器 以及该类中的以下方法,但没有效果:

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

    我也试着打电话 [self-setNeedsStatus条形外观更新]; 在里面 主视图控制器 在…上 prepareForSegue: sender: 条件为的方法 - (UIStatusBarStyle)preferredStatusBarStyle {} 返回 UIS状态条形灯内容 当模态视图出现时,但这也没有任何影响。

    如何更改模式视图中的UIStatusBarStyle?

    编辑: 帖子更新:我需要提到的是 模式视图控制器 嵌入到 导航控制器 用一个 NavigationBar 具有 导航栏 设置为隐藏到的调用之上 [self-setNeedsStatus条形外观更新]; 在里面 模式视图控制器 工作正常。但当酒吧可见时就不行了。

    9 回复  |  直到 11 年前
        1
  •  29
  •   jaetzold    11 年前

    您需要一个全屏显示的ViewController来返回相应的状态栏信息。在您的情况下:包含ModalViewController的NavigationController需要实现 preferredStatusBarStyle 和返回 UIStatusBarStyleLightContent .

    打电话给 setNeedsStatusBarAppearanceUpdate 只有当视图控制器返回的值实际发生更改时才有必要。当视图控制器首次出现时,无论如何都会对其进行查询。

        2
  •  25
  •   Puttin    6 年前

    我们应该注意到非全屏模式VC 罐头 使用 modalPresentationCapturesStatusBarAppearance 以控制statusBar样式。

    任何想了解更多关于状态栏控件的人都不应该忽视 UIViewController Managing the Status Bar .

    2015年11月6日更新:

    并确保您已设置 UIViewControllerBasedStatusBarAppearance 描述于 iOS Keys

    更新时间:2018.04.09:

    我注意到导航控制器中的viewController可能无法接到呼叫 prefersStatusBarHidden 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
    

    任何想深入了解UIKit的人都可以深入了解 +[UIViewController _currentStatusBarStyleViewController] 使用Hopper或IDA Pro。它可能会帮助您解决这些类型的错误。

        3
  •  11
  •   Juddster    11 年前

    实现这一点的关键是,只有全屏视图控制器才能决定状态栏的样式。

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

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

    (以下对我有效。如果你的应用程序是基于TabBar的,你会想通过子类化UITabBarController来做类似的事情,但我还没有尝试过)。

    @interface MyNavigationController : UINavigationController
    
    @end
    
    @implementation MyNavigationController
    
    - (UIStatusBarStyle)preferredStatusBarStyle
    {
        return self.topViewController.preferredStatusBarStyle;
    }
    
    @end
    
        4
  •  6
  •   Alex Wally    9 年前

    要在不子类化UINavigationController的情况下更改嵌入ViewController的UINavigationControl的状态栏,请使用以下方法:

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

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

        5
  •  2
  •   Graham Perks    11 年前

    我有一个侧菜单/显示控制器(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;
    }
    
        6
  •  1
  •   William Jockusch    11 年前

    这个应用程序似乎偏离了最上面的viewController的statusBarStyle。因此,如果您在当前视图控制器的基础上添加另一个视图控制器,它现在可以从新的视图控制器中获得提示。

        7
  •  1
  •   Community Marino Di Clemente    7 年前

    这对我来说很有效:

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

    希望它能有所帮助(参考: ios7 status bar changing back to black on modal views? )

        8
  •  0
  •   devClown    11 年前

    如果你的应用程序 rootViewController需要重写-(UIStatusBarStyle)preferredStatus BarStyle方法

        9
  •  0
  •   bainfu    10 年前

    以上所有工作。然而,有时我发现去改变故事板中的每个实例真的很痛苦……所以这里有一些对我有用的东西,也涉及到子类化。

    首先创建子类:

    @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,我只是觉得这很方便。