UIApplication.sharedApplication().setStatusBarStyle() 在 iOS 9 中已弃用

UIApplication.sharedApplication().setStatusBarStyle() deprecated in iOS 9

我一直在用

UIApplication.sharedApplication().setStatusBarStyle()

在我的 appDelegate 中,它运行良好,但自 iOS 9 起,此方法已被弃用,我找不到替代方法。

我想将整个应用程序的状态栏样式更改为 .LightContent, 但是 xCode 给我的唯一建议是在每个 VC 中单独处理这个问题;

override func preferredStatusBarStyle() -> UIStatusBarStyle {
    return .LightContent
}

有谁知道如何为整个应用程序执行此操作?

提前致谢

这是 AppDelegate 中的新方法:

UIApplication.sharedApplication().setStatusBarStyle(UIStatusBarStyle.LightContent, animated: true)

我想我找到了解决办法。 我最终设置了

View controller-based status bar appearance 布尔值到 NO

在我的 info.plist 文件中。

然后我去了目标的 General settings -> Deployment info 并更改了下拉选项 Status Bar StyleLight 而不是 Default

这将我整个应用程序的状态栏样式更改为 Light,这正是我想要的。

希望对您有所帮助!

我在 Xcode 7.

中工作得很好

在 AppDelegate 中:

UIApplication.sharedApplication().statusBarStyle = .LightContent

在info.plist中,设置: View controller-based status bar appearance 布尔值到 NO

在 app delegate 的 didFinishLaunchingWithOptions 中,使用函数参数 application(而不是 [UIApplication sharedApplication] 或类似 swift 中的 UIApplication.sharedApplication())来设置它所以:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    application.statusBarStyle = UIStatusBarStyleLightContent;
}

在swift3.

在您的视图控制器中:

override var preferredStatusBarStyle: UIStatusBarStyle {
    return UIStatusBarStyle.lightContent
}

如果您希望应用 运行 您的启动屏幕在 lightContent 中也有状态栏,那么:

在Swift中3是这样的:

 UIApplication.shared.statusBarStyle = .lightContent

对于那些仍在使用 Swift 3 in Xcode 8 的人:

(与上面 Marlon Ruiz 的回答略有不同,不是覆盖函数,而是在 viewDidLoad 中)

override func viewDidLoad() {
    super.viewDidLoad()

    var preferredStatusBarStyle: UIStatusBarStyle {
        return .lightContent
    }
}

要在视图控制器上动态更新 UIStatusBarStyle,请使用此方法

这还将删除已弃用的警告

'setStatusBarStyle:' 已弃用:首先在 iOS 9.0 中弃用 - 使用 -[UIViewController preferredStatusBarStyle]

用于调用

[[UIApplication sharedApplication] setStatusBarStyle:style];

让我们开始吧

Objective - C

定义UtilityFunction

+(void)setStatusBarStyle:(UIStatusBarStyle )style {    
    [[NSUserDefaults standardUserDefaults] setInteger:style forKey:@"UIStatusBarStyle"];
    [[NSUserDefaults standardUserDefaults] synchronize];
}

在你的 BaseViewController

中覆盖这个方法
- (UIStatusBarStyle)preferredStatusBarStyle {
    UIStatusBarStyle style = [[NSUserDefaults standardUserDefaults] integerForKey:@"UIStatusBarStyle"];
    return style;
}

使用 UtilityFunction 为 AnyViewController 设置 UIStatusBarStyle 值,如下所示:

[UtilityFunctions setStatusBarStyle:UIStatusBarStyleDefault];

// call below code for preferred style
[self preferredStatusBarStyle];

Swift 4.0

定义UtilityFunction

class func setPreferedStyle(style:UIStatusBarStyle)->Void {
    UserDefaults.standard.set(style, forKey: "UIStatusBarStyle")
    UserDefaults.standard.synchronize()
}

在你的 BaseViewController

中覆盖这个方法
override var preferredStatusBarStyle: UIStatusBarStyle {
    if let style: UIStatusBarStyle = UIStatusBarStyle(rawValue:UserDefaults.standard.integer(forKey: "UIStatusBarStyle")) {
        return style
    }
    return UIStatusBarStyle.lightContent
}

使用 UtilityFunction 为 AnyViewController 设置 UIStatusBarStyle 值,如下所示:

Utility.setPreferedStyle(style: .lightContent)

// call below code for preferred style
preferredStatusBarStyle()

Swift5,iOS13.5+

我要回顾一下,希望对您有所帮助。

#1:不使用 preferredStatusBarStyle

的一般解决方案

要回答这个问题,如果我们不想关心异常屏幕并且不使用来自视图控制器的 preferredStatusBarStyle 属性 作为 Apple建议,我认为确实将 UIViewControllerBasedStatusBarAppearance 设置为 false 并将 General settings -> Deployment info 下的 Status Bar Style 更改为亮灯,正如@Rick 已经推荐的那样,是可行的方法。

#2:使用preferredStatusBarStyle

对于我的情况,我希望能够将 UIStatusBarStyle.lightContent 作为默认值,但某些屏幕具有 UIStatusBarStyle.default;在这种情况下,解决方案 #1 是不可能的。

由于对 UIViewController 也有一个允许更改默认值的通用扩展,显然对于这个 属性 是不可能的,如果我们不这样做,那么在这些情况下唯一也是最好的方法不想使用已弃用的方法,是通过 inheritance.

因此,一种可能性是让控制器继承自 BaseViewController(以及 BaseNavigationController,如果你使用的话),将 preferredStatusBarStyle 设置为 .lightContent.

通过这种方法,现在您只需在需要的地方将样式设置为 default,同时将 lightContent 保持为默认值。