在Swift中UIStatusBarStyle无效

87

我试图将我的Swift应用程序中的状态栏颜色更改为白色,但是遇到了瓶颈。我有3个视图控制器,每个都嵌入在NavigationController中(可能是问题吗?我已经尝试将代码放置在NavigationController类中)。我已经在AppDelegate.swift文件的didFinishLaunchingWithOptions中尝试使用以下两个代码片段,但都没有起作用。

application.statusBarStyle = .LightContent

UIApplication.sharedApplication().statusBarStyle = .LightContent

关于此事,文档只是说 UIBarButtonStyle 是一个整数,并且给了我这个枚举代码片段,但并没有帮助我进行实现。

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

我错过了什么?

11个回答

148

你有两个选择。

如果你想继续手动设置状态栏的样式,可以继续现在的做法,但你需要在 info.plist 文件中添加以下键值对,并将值设为 NO

View controller-based status bar appearance

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

Swift 3

override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
}

Swift 2

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

我已经尝试了这段代码...但是只有在第一个屏幕中才能看到白色状态栏...我在其他屏幕上没有看到状态栏 :(..有什么帮助吗? - Rahul
7
你需要在plist文件中将“View controller-based status bar appearance”设置为YES,以控制状态栏的外观。 - StackUnderflow
1
只有在您想使用基于视图控制器的状态栏外观时才需要这样做。 - Sam Holmes
4
在iOS 10(Swift 3.0)中,它不再是一个方法,而是一个属性。请参见:https://dev59.com/eFkT5IYBdhLWcg3wPtQv - stevo.mit
仅返回翻译文本:只为一个屏幕 - Oubaida AlQuraan

143

Swift 3.0

在AppDelegate.swift中的didFinishLaunchingWithOptions方法中

UIApplication.shared.statusBarStyle = .lightContent

信息属性清单

View controller-based status bar appearance -> NO

Swift 2.2

在 AppDelegate.swift 的 didFinishLaunchingWithOptions 方法中

UIApplication.sharedApplication().statusBarStyle = .LightContent

信息属性清单

View controller-based status bar appearance -> NO

3
抱歉,这可能是最简单的答案,但它绝对不是最好的答案:因为它只将此样式设置为应用程序中所有视图控制器的通用样式。该行为被引入以实现更精细的控制,并根据不同的视图控制器应用不同的设置(例如混合浅色和深色内容)。 - auco
很奇怪——不是苹果文档上所说的方法,但它确实有效。尝试了许多其他方法,包括基于UIViewController的状态栏,但没有一个可行。 - n13

37
您需要设置以下代码才能实现效果:

navigationController.navigationBar.barStyle = .black

这样,文本将以白色显示。

1
谢谢! 即使如此,以下代码没有起到任何作用:override func preferredStatusBarStyle() -> UIStatusBarStyle { return UIStatusBarStyle.LightContent }但是以下代码确实有帮助:navigationController.navigationBar.barStyle = .BlackTranslucent navigationController.navigationBar.translucent = true - Svitlana
谢谢!你救了我的一天。然而,BlackTranslucent已经被弃用了。因此,我使用navigationController.navigationBar.barStyle = .Black。 - hsusmita
它与 override var preferredStatusBarStyle: UIStatusBarStyle { return .lightContent } 完美地配合工作。你只需要在 viewDidLoad 中写入这一行代码就可以了。确保使用此解决方案时保持 View controller-based status bar appearance = YES - Bhavin_m
似乎有些过度了...我刚试了一下,在Info.plist文件中这样做就可以了:
  1. 状态栏样式 -> UIStatusBarStyleLightContent
  2. 基于视图控制器的状态栏外观 -> NO
- raistlin
这个更改导致我的后退按钮消失了。 - Leon

21

对于iOS9.x和Xcode7,只需将以下内容放入AppDelegate.swift文件中:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

    UINavigationBar.appearance().barStyle = .Black

} 

这将自动将UINavigationController内所有视图控制器的状态栏样式更改为.Lightcontent

(另外,从Info.plist中删除View controller-based status bar appearance以消除您可能看到的警告!)


谢谢。iOS9似乎存在一个严重的错误。这是我能够将初始VC中的状态栏变为白色的唯一方法。我尝试了所有可能的方法。我会提交一个radar。 - 1b0t
preferredStatusBarStyle返回UIStatusBarStyleDefault,但不会将lightcontent更新为特定视图控制器的darkcontent。在viewWillAppear中使用self.navigationController.navigationBar.barStyle=UIBarStyleDefault;对我有用。希望这个评论能帮助其他人。 - Pandey_Laxman
请注意,在Swift 3中,UIStatusBarStyle已更改为“.black”(小写B)。 - brycejl

16

在Swift 3中,状态栏样式已更改为UIViewController中的计算属性,您可以像这样覆盖它:

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

13
在iOS 9上,setStatusBarStyle方法已经过时了,如果你采用这种方式会收到一个警告。
UIApplication.sharedApplication().setStatusBarStyle(UIStatusBarStyle.LightContent, animated: true)

如果您希望一次性更改所有状态栏,请尝试在您的Info.plist中添加以下内容。这也会使您的启动屏幕状态栏变为白色。虽然上面的代码不会这样。

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

.plist方法是正确的,但setStatusBarStyle()不必要。'setStatusBarStyle(_:animated:)'在iOS 9.0中已被弃用:请使用-[UIViewController preferredStatusBarStyle]。 - Bill Chan
@BillChan 谢谢你的评论,但请再次阅读答案。我已经解释了 'setStatusBarStyle' 已被弃用。如果您想更改一个或另一个视图控制器,则应使用 preferredStatusBarStyle。 plist方法适用于希望在单个操作中更改所有视图控制器的人。这里没有对错之分,只是根据您需要实现的内容而定。 - GuiSoySauce
1
UIStatusBarStyle = UIStatusBarStyleLightContent(在.plist文件中)帮助我的应用程序以白色状态栏文本启动...谢谢!!! - Chris Allinson

11

在我看来,所有的方法都没有生效,直到我添加了以下内容:

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

所以:

  1. .plist中将UIViewControllerBasedStatusBarAppearance设置为YES
  2. viewDidLoad中调用self.setNeedsStatusBarAppearanceUpdate();
  3. 重写preferredStatusBarStyle
    override var preferredStatusBarStyle: UIStatusBarStyle { return .lightContent }
  4. 在覆盖的方法中,我还设置了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
    }
}

1
没有关于导航栏样式的评论...但在Swift 3,Xcode 8中 - 这是我找到的唯一解决方案。 - Despotovic
我注意到的唯一缺点是,尽管有所有这些步骤,但它没有动画效果。 - Lukasz 'Severiaan' Grela

5

很奇怪,使用 Swift 3.1 和 XC8.2.1,但以上所有方法都没有起作用。

我所做的只是

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

没有Plist,没有其他的东西。 希望对你有帮助。

也适用于 Swift 4.2。 - zeeshan

2
在Swift 3.0中,您可以重写ViewController中的getter以实现基于视图控制器的状态栏外观:
override var preferredStatusBarStyle: UIStatusBarStyle {
    get { return .lightContent }
}

1
Step 1. 在info.plist中添加View controller-based status bar appearance -> NO Step 2. 在需要更改状态栏颜色的方法中添加代码:
UIApplication.shared.statusBarStyle = .lightContent //(or .default)
setNeedsStatusBarAppearanceUpdate()

代码关键行: setNeedsStatusBarAppearanceUpdate()


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接