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

lwx*_*ted 16 iphone uinavigationbar uinavigationcontroller ipad ios

我需要让一个特定的ViewController嵌入到一个UINavigationController具有光状态栏文本颜色(但其他ViewControllers表现不同).我知道至少有3种方法,但无论如何都不适用于我的情况.

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

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

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

    在iOS 7.0.3上运行,此方法对我不起作用,因为即使在我正确实现了所有3个步骤之后,preferredStatusBarStyle也从未调用过.

  2. UIStatusBarStyle PreferredStatusBarStyle在iOS 7上不起作用,该方法主要是:

    将你的navigationBar's 设置barStyleUIBarStyleBlackTranslucent将给出白色状态栏文本(即.UIStatusBarStyleLightContent),UIBarStyleDefault并将给出黑色状态栏文本(即.UIStatusBarStyleDefault).

    这种方法在iPhone上公平公正,但不适用于iPad.

  3. 在plist中设置UIViewControllerBasedStatusBarAppearanceto NO,并使用

    [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
    
    Run Code Online (Sandbox Code Playgroud)

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

谢谢大家的帮助!

Gro*_*oot 13

对于有这个问题的人UINavigationController我可以建议创建一个自定义UINavigationControllerpreferredStatusBarStyle在其上实现如下:

- (UIStatusBarStyle)preferredStatusBarStyle
{
    return [self.topViewController preferredStatusBarStyle];
}
Run Code Online (Sandbox Code Playgroud)

这样,状态栏样式将是顶视图控制器的样式.现在你可以实现preferredStatusBarStyle你喜欢的视图控制器了.


vsi*_*lux 8

这是对Groot答案的改进,以UINavigationController的简单类别的形式,而不需要子类UINavigationController.

迅速

extension UINavigationController {
    override public func preferredStatusBarStyle() -> UIStatusBarStyle {
        return topViewController?.preferredStatusBarStyle() ?? .Default
    }
}
Run Code Online (Sandbox Code Playgroud)

Swift 3和Swift 4

extension UINavigationController {
    open override var preferredStatusBarStyle: UIStatusBarStyle {
        return topViewController?.preferredStatusBarStyle ?? .default
    }
}
Run Code Online (Sandbox Code Playgroud)

Objective-C的

@implementation UINavigationController (StatusBarStyle)

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

@end
Run Code Online (Sandbox Code Playgroud)


Guf*_*ros 6

要设置UIStatusBarStyle单独为每个UIViewControllerUINavigationController栈你必须先继承你UINavigationController和覆盖childViewControllerForStatusBarStyle方法.

在你的UINavigationController子类中添加:

-(UIViewController *)childViewControllerForStatusBarStyle {
     return self.visibleViewController;
}
Run Code Online (Sandbox Code Playgroud)

你可以UIStatusBarStyle在每种UIViewController使用preferredStatusBarStyle方法中设置任何你想要的东西.例如:

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


小智 -3

目前你只能做浅色和深色。改为光做。

  1. 在文件中设置UIViewControllerBasedStatusBarAppearance为。YES.plist

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

  3. 添加这个方法:

-(UIStatusBarStyle)preferredStatusBarStyle{ return UIStatusBarStyleLightContent; }

要将其改回深色,请更改UIStatusBarStyleLightContentUIStatusBarStyleDefault