如何在Swift中设置状态栏风格3

我正在使用Xcode 8.0 beta 4。

在以前的版本中,UIViewController有设置状态栏风格的方法

public func preferredStatusBarStyle() -> UIStatusBarStyle 

但是,我发现它在Swift 3中变成了“只可变varaiable”。

 public var preferredStatusBarStyle: UIStatusBarStyle { get } 

如何提供在我的UIViewController中使用的样式?

您可以尝试覆盖返回的值,而不是设置它。 该方法被声明为{get},所以只需要提供一个getter:

  override var preferredStatusBarStyle: UIStatusBarStyle { return .lightContent } 

如果您有条件地设置,则需要调用setNeedsStatusBarAppearanceUpdate()以便在准备就绪时生成更改

ios 10和swift 3

  1. info.plist中更改该行查看基于控制器的状态栏外观 ,并将其设置为NO

  2. 更改didFinishLaunchingWithOptions中的appDelegate.swift

     UIApplication.shared.statusBarStyle = .lightContent 

Swift 3,iOS 10
对我而言,这种方法不起作用:

 override var preferredStatusBarStyle: UIStatusBarStyle { return .lightContent } 

当我使用每个视图控制器,但这工作:

  • 在文件info.list中,添加行: View controller-based status bar appearance并设置为NO

  • 接下来在appdelegate:

     UIApplication.shared.statusBarStyle = .lightContent 

您需要在Info.plist文件中添加以下键:

View controller-based status bar appearance ,布尔值设置为NO

在你的appdelegate类中,在didFinishLaunchingWithOptions方法返回之前。

 let statusBar: UIView = UIApplication.shared.value(forKey: "statusBar") as! UIView if statusBar.responds(to:#selector(setter: UIView.backgroundColor)) { statusBar.backgroundColor = UIColor.red } UIApplication.shared.statusBarStyle = .lightContent 

根据需要更改backgroundColorstatusBarStyle

如果你想在视图出现后的任何时候改变状态栏的样式,你可以使用这个:

  • 在文件info.list中添加行: 查看基于控制器的状态栏外观 ,并将其设置为YES

     var viewIsDark = Bool() func makeViewDark() { viewIsDark = true setNeedsStatusBarAppearanceUpdate() } func makeViewLight() { viewIsDark = false setNeedsStatusBarAppearanceUpdate() } override var preferredStatusBarStyle: UIStatusBarStyle { if viewIsDark { return .lightContent } else { return .default } } 

第一步,需要添加一行键: View controller-based status bar appearance和值为Info.plist文件的NO 。 之后,在你的控制器中添加2个函数,只有控制器才会生效:

 override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) UIApplication.shared.statusBarStyle = .lightContent } override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) UIApplication.shared.statusBarStyle = .default } 

如果你想将statusBar的颜色更改为白色,那么对于包含在UINavigationController所有视图,请在AppDelegate添加:

 func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { // Override point for customization after application launch. UINavigationBar.appearance().barStyle = .blackOpaque return true } 

此代码:

 override var preferredStatusBarStyle: UIStatusBarStyle { return .lightContent } 

对于包含在UINavigationController UIViewControllers不起作用,因为编译器查找UINavigationControllerstatusBarStyle ,而不是查找它包含的ViewControllersstatusBarStyle

希望这有助于那些没有被接受的答案的成功!

Xcode 8.3.1,Swift 3.1

  1. 在info.plist中创build一个新条目“基于视图控制器的状态栏外观”将其设置为“NO”。

  2. 打开AppDelegate.swift并在“didFinishLaunchingWithOptions”方法中添加这些行:

application.statusBarStyle = .lightContent

你也可以在故事板中做到这一点

  1. 在info.plist中创build一个新条目“基于视图控制器的状态栏外观”将其设置为“YES”。
  2. 转到故事板,然后select要更改的导航控制器。 单击故事板文档大纲部分的导航栏(故事板上的左侧面板)
  3. 转到右侧面板,然后单击属性部分
  4. 在导航栏部分,您将看到样式。 select您想要的样式(默认为黑色,黑色为白色)

您必须为每个导航控制器执行此操作。 但是,该导航控制器下的任何视图都会将所有视图的状态栏样式/颜色更改为您刚select的状态栏。 我发现这个选项更好,因为你可以立即看到你的结果,而不必在每个视图控制器中添加额外的代码行。

在这里输入图像说明

(在所有Swift项目中使用Xcode 8.3.3完成)

这对我有效

在plist中将View controller-based status bar外观设置为NO ,然后在UIViewController viewDidAppear只是添加了以下行

 UIApplication.shared.setStatusBarStyle(UIStatusBarStyle.lightContent, animated: true) 

Swift 3,Xcode 8.3.3

首先,进入Info.plist并添加一个名为“基于视图控制器的状态栏外观”的行,并将其(仅布尔值)设置为“NO”。

 class YourViewController: UIViewController { // view did load override func viewDidLoad() { super.viewDidLoad() // custom status bar UIApplication.shared.statusBarStyle = .lightContent //or .default setNeedsStatusBarAppearanceUpdate() } } 

我得到:

重写var必须与其封闭types一样可访问

这是通过添加public来解决的:

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

在Swift3 iOS10上。

迅速3

如果在Info.plist中,基于视图控制器的状态栏外观= YES

然后对所有的NavigationController使用这个扩展

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

如果没有UINavigationController并且只有UIViewController,则使用下面的代码:

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

对于目标C,只需在应用程序didFinishLaunch方法中添加此行即可

 UIApplication.sharedApplication.statusBarStyle = UIStatusBarStyleLightContent; 

Swift 3

要在应用程序中设置相同的导航栏外观,可以在AppDelegate.swift中执行此操作:

 func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { setupNavigationBarAppearence() return true } private func setupNavigationBarAppearence(){ let navigationBarAppearace = UINavigationBar.appearance() navigationBarAppearace.isTranslucent = false //nav bar color navigationBarAppearace.barTintColor = UIColor.primaryColor() //SETS navbar title string to white navigationBarAppearace.titleTextAttributes = [NSForegroundColorAttributeName: UIColor.white] //Makes the batery icon an any other icon of the device to white. navigationBarAppearace.barStyle = .black } 

Swift 4.0请使用此代码在“didFinishLaunchingWithOptions launchOptions:”Appdelegate类

 UIApplication.shared.statusBarStyle = .lightContent let statusBar: UIView = UIApplication.shared.value(forKey: "statusBar") as! UIView if statusBar.responds(to: #selector(setter: UIView.backgroundColor)){ statusBar.backgroundColor = UIColor.black }