基于不同的ViewController在iOS 7中设置灯光状态栏文字颜色的正确方法

我需要让一个特定的ViewControllerembedded在UINavigationController使其状态栏的文字颜色为淡(但其他ViewController的行为不同)。 我知道至less有3种方法,但其中没有一种适用于我的情况。

  1. 如何在iOS 7中更改状态栏的文字颜色 ,方法主要是:

    • 在plist中将UIViewControllerBasedStatusBarAppearance设置为YES
    • 在viewDidLoad中做一个[self setNeedsStatusBarAppearanceUpdate];
    • 添加以下方法:

       - (UIStatusBarStyle)preferredStatusBarStyle{ return UIStatusBarStyleLightContent; } 

    运行在iOS 7.0.3上,这个方法对我来说不起作用,因为即使我正确实现了所有3个步骤, preferredStatusBarStyle也不会被调用。

  2. UIStatusBarStyle PreferredStatusBarStyle不适用于iOS 7 ,该方法主要是:

    将你的navigationBarbarStyle设置为UIBarStyleBlackTranslucent会给出白色的状态栏文本(即UIStatusBarStyleLightContent ),而UIBarStyleDefault会给出黑色的状态栏文本(即UIStatusBarStyleDefault )。

    这个方法在iPhone上公平地工作,而不是在iPad上。

  3. 在plist中将UIViewControllerBasedStatusBarAppearance设置为NO ,然后使用

     [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent]; 

    这显然不适用于这种情况,因为我只需要为两个ViewController指定不同的状态栏颜色。

感谢所有的帮助!

对于有UINavigationController这个问题的人,我可以推荐创build一个自定义的UINavigationController并像这样实现preferredStatusBarStyle

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

那样的状态栏风格将是顶视图控制器的风格。 现在你可以无论如何实现视图控制器的preferredStatusBarStyle

要为UINavigationController堆栈上的每个UIViewController单独设置UIStatusBarStyle ,必须首先创build子类UINavigationController并覆盖childViewControllerForStatusBarStyle方法。

在你的UINavigationController子类中添加:

 -(UIViewController *)childViewControllerForStatusBarStyle { return self.visibleViewController; } 

比你可以设置UIStatusBarStyle任何你想在每个UIViewController使用preferredStatusBarStyle方法。 例如:

 -(UIStatusBarStyle)preferredStatusBarStyle { return UIStatusBarStyleLightContent; } 

下面是对Groot答案的一个改进,以UINavigationController的简单类别的forms,而不需要inheritanceUINavigationController。

迅速

 extension UINavigationController { override public func preferredStatusBarStyle() -> UIStatusBarStyle { return self.topViewController?.preferredStatusBarStyle() ?? .Default } } 

Objective-C的

 @implementation UINavigationController (StatusBarStyle) - (UIStatusBarStyle)preferredStatusBarStyle { return [self.topViewController preferredStatusBarStyle]; } @end 

我使用了你提到的第一种方法,我也发现当你使用UINavigationController时候有点儿bug,它永远不会将preferredStatusBarStyle调用传递给它的子视图控制器。 我所做的是UINavigationController ,并重写preferredStatusBarStyle方法,如下所示:

 @implementation GLBaseNavigationController - (UIStatusBarStyle)preferredStatusBarStyle { UIViewController *lastViewController = [self.viewControllers lastObject]; if ([lastViewController respondsToSelector:@selector(preferredStatusBarStyle)]) { return [lastViewController preferredStatusBarStyle]; } else if ([super respondsToSelector:@selector(preferredStatusBarStyle)]) { return [super preferredStatusBarStyle]; } return UIStatusBarStyleDefault; } 

然后,无论何时我需要一个导航控制器,我使用GLBaseNavigationController而不是UINavigationController 。 对于故事板,您还需要为您的子类指定导航控制器的类。

对于你的第一个解决scheme,我不认为你可以在viewDidLoad中更改状态栏。 如果你有两个ViewController堆叠在一起,每个ViewController都以不同的方式切换状态栏,那么这个方法只会被调用一次。 你真的想在viewWillAppear更改状态栏,这样每次页面显示时都会调用它。 我也不认为你可以依靠preferredStatusBarStyle因为我也不知道多久/什么时候被调用。 这是你想要做到的:

 - (void) viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; [self.navigationController.navigationBar setBarStyle:UIBarStyleDefault]; } 

目前你只能做光明和黑暗。 要改变光明做。

  1. .plist文件中将UIViewControllerBasedStatusBarAppearance设置为YES

  2. viewDidLoad方法中做[self setNeedsStatusBarAppearanceUpdate];

  3. 添加这个方法:

-(UIStatusBarStyle)preferredStatusBarStyle{ return UIStatusBarStyleLightContent; }

要将其更改为黑暗,请将UIStatusBarStyleLightContent更改为UIStatusBarStyleDefault

在你的AppDelegate didFinishLaunch方法中,设置默认的状态栏风格,说:

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefault animated:YES]; return YES; } 

然后,在你想要改变状态栏的那两个视图控制器中,覆盖下面的方法:

 - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated] // Here change status bar color [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent animated:YES]; } - (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear] // Here bring back to color, that we set in AppDelegate [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefault animated:YES]; }