UIStatusBarStyle不能在Swift中工作

我试图改变我的Swift应用程序的状态栏颜色为白色,但我打砖墙。 我有3个ViewControllers每个embedded在一个NavigationController(可能是这个问题?我已经尝试将代码放在NavigationController类。)我已经在我的AppDelegate的didFinishLaunchingWithOptions中尝试了以下两段代码.swift文件,但都没有工作。

application.statusBarStyle = .LightContent 

 UIApplication.sharedApplication().statusBarStyle = .LightContent 

所有的文档必须要说的是,UIBarButtonStyle是一个Int,并给了我这个枚举片段,这并没有帮助我在所有的implimentation。

 enum UIStatusBarStyle : Int { case Default case LightContent case BlackOpaque } 

我错过了什么?

你有两个select。

如果您想要继续手动设置状态栏的样式,请继续执行您正在做的操作,但是您需要将以下按键添加到您的info.plist文件中,其值为NO

查看基于控制器的状态栏外观

或者,如果您想要继续使用基于视图控制器的状态栏外观,而不是设置应用程序的statusBarStyle,请覆盖要为其指定状态栏样式的每个视图控制器中的preferredStatusBarStyle属性。

Swift 3

 override var preferredStatusBarStyle: UIStatusBarStyle { return .lightContent } 

Swift 2

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

Swift 3.0

在AppDelegate.swift didFinishLaunchingWithOptions

 UIApplication.shared.statusBarStyle = .lightContent 

的Info.plist

 View controller-based status bar appearance -> NO 

Swift 2.2

在AppDelegate.swift didFinishLaunchingWithOptions

 UIApplication.sharedApplication().statusBarStyle = .LightContent 

的Info.plist

 View controller-based status bar appearance -> NO 

你必须设置:

navigationController.navigationBar.barStyle = .black

文字将以白色出现

对于iOS9.x和Xcode7,只需将其放入AppDelegate.swift

 func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { UINavigationBar.appearance().barStyle = .Black } 

这会自动将您的状态栏的风格变为.Lightcontent在UINavigationController中的所有视图控制器。

(另外,从Info.plist中删除View controller-based status bar appearance来抑制你也可能看到的警告!)

在Swift 3中,状态栏的样式已经改变为UIViewController中的一个计算属性,你可以像这样重写:

 override var preferredStatusBarStyle: UIStatusBarStyle { return .lightContent //or default } 

在iOS 9上,不推荐使用以下(setStatusBarStyle),如果你这样做,你会得到一个警告。

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

如果你想在一个镜头中更改所有状态栏,请尝试将以下内容添加到Info.plist中。 这也将使您的启动屏幕状态栏变成白色。 而上面的代码不会。

 <key>UIStatusBarStyle</key> <string>UIStatusBarStyleLightContent</string> <key>UIViewControllerBasedStatusBarAppearance</key> <false/> 

对于我以上的所有工作,直到我补充说:

 self.navigationController?.navigationBar.barStyle = .black; 

所以:

  1. .plist中将UIViewControllerBasedStatusBarAppearance设置为YES
  2. viewDidLoad调用self.setNeedsStatusBarAppearanceUpdate();
  3. 覆盖preferredStatusBarStyle
    override var preferredStatusBarStyle: UIStatusBarStyle { return .lightContent }
  4. 在overrided方法我也设置navigationBar.barStyle所以最后
    对于内容:
    override var preferredStatusBarStyle: UIStatusBarStyle { self.navigationController?.navigationBar.barStyle = .black;//or default return .lightContent //or default }
    黑色内容使用默认

来自这里和这里的来源。

如果这不起作用,你可以尝试添加一个UINavigationController extension

 extension UINavigationController { override open var preferredStatusBarStyle: UIStatusBarStyle { if let lastVC = self.viewControllers.last { return lastVC.preferredStatusBarStyle } return .default } } 

奇怪的是,使用Swift 3.1和XC8.2.1,但以上所有都不起作用。

我所做的只是

 extension UINavigationController { override open var preferredStatusBarStyle: UIStatusBarStyle { get { return .lightContent } } } 

没有Plist,没有其​​他的东西。 HTH

不要编辑你的Info.plist。 将此添加到您的ViewController.swift:

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

在Swift 3.0中,您可以在ViewController中重写一个基于View控制器的状态栏外观的getter:

 override var preferredStatusBarStyle: UIStatusBarStyle { get { return .lightContent } }