UIStatusBarStyle在Swift中不起作用


85

我正在尝试将我的Swift应用程序中的状态栏颜色更改为白色,但遇到了砖墙。我有3个ViewController,每个ViewController都嵌入到NavigationController中(这可能是问题吗?我已经尝试将代码放入NavigationController类中。)我已经在AppDelegate的didFinishLaunchingWithOptions中尝试了以下两个代码.swift文件,但均无效。

application.statusBarStyle = .LightContent

UIApplication.sharedApplication().statusBarStyle = .LightContent

Docs唯一需要说的就是UIBarButtonStyle是一个Int,并且给了我这个枚举片段,这对我的实现毫无帮助。

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

我想念什么?

Answers:


145

您有两个选择。

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

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

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

迅捷3

override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
}

迅捷2

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

我已经尝试过此代码...但是我在第一个屏幕上只看到白色的状态栏。.在其他屏幕上我没有得到状态栏:( ..有帮助吗?
Rahul 2015年

7
您必须将plist中的“基于View Controller的状态栏外观”设置设置为YES。
StackUnderflow

1
仅当您使用基于视图控制器的状态栏外观时。
山姆·霍姆斯

4
在iOS 10(Swift 3.0)中,它不再是方法,而是属性。请参阅:stackoverflow.com/questions/38862208/...
stevo.mit

仅用于一个屏幕
Oubaida AlQuraan

143

斯威夫特3.0

在AppDelegate.swift didFinishLaunchingWithOptions中

UIApplication.shared.statusBarStyle = .lightContent

信息清单

View controller-based status bar appearance -> NO

斯威夫特2.2

在AppDelegate.swift didFinishLaunchingWithOptions中

UIApplication.sharedApplication().statusBarStyle = .LightContent

信息清单

View controller-based status bar appearance -> NO

1
这是一个完美的答案:)
Jay Mayu

1
完美的答案。简短而甜美。
Mehul

3
抱歉,这可能是最简单的答案,但绝对不是最好的答案:因为它只是将这种样式设置为应用程序中的所有viewControllers。已引入此行为以实现更精细的控制并基于不同的视图控制器(例如,将明暗内容混合)应用不同的设置。
auco

这很奇怪-并非苹果医生所说的那样,但它确实有效。尝试了其他方法,包括使用基于UIViewController的状态栏,但没有一种有效。
n13

33

您必须设置:

navigationController.navigationBar.barStyle = .black

文字将显示为白色


1
谢谢!即使对此重写函数func preferredStatusBarStyle()-> UIStatusBarStyle {return UIStatusBarStyle.LightContent}都没有帮助,这真的有帮助:navigationController.navigationBar.barStyle = .BlackTranslucent navigationController.navigationBar.translucent = true
Svitlana

谢谢!你救了我的日子。但是,不推荐使用BlackTranslucent。因此,我使用了navigationController.navigationBar.barStyle =
.Black

与完美配合override var preferredStatusBarStyle: UIStatusBarStyle { return .lightContent }。您只需要写好这一行就可以了viewDidLoad。确保遵循View controller-based status bar appearance = YES此解决方案。
Bhavin_m

似乎是一个过大的杀伤力……只是尝试了一下,并在Info.plist文件中像这样工作:1.状态栏样式-> UIStatusBarStyleLightContent 2.查看基于控制器的状态栏外观-> NO
raistlin

21

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

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

    UINavigationBar.appearance().barStyle = .Black

} 

这将自动将状态栏的样式变为.LightcontentUINavigationController中所有视图控制器的样式。

(此外,View controller-based status bar appearance从Info.plist中删除以禁止显示可能也显示的警告!)


谢谢。iOS9中似乎存在一个严重的错误。这是我可以将状态栏更改为初始VC白色的唯一方法。我尝试了一切。我将提出雷达。
1b0t 2015年

preferredStatusBarStyle返回UIStatusBarStyleDefault,但不将特定viewcontroller的lightcontent更新为darkcontent。在self.navigationController.navigationBar.barStyle = UIBarStyleDefault之后;在viewWillAppear为我工作。希望此评论对其他人有帮助。
Pandey_Laxman,2015年

请注意,在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)

如果要一次更改所有statusBar,请尝试将以下内容添加到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”已被弃用。如果要更改一个或另一个viewControllers,则应使用preferredStatusBarStyle。plist方法适用于希望一次更改所有viewController的人员。这里没有对与错。只是您需要实现的问题。
GuiSoySauce

1
UIStatusBarStyle = UIStatusBarStyleLightContent(在.plist中)使用白色状态栏文本帮助我的应用启动...谢谢!!!
克里斯·艾林森

10

对我来说,在我添加之前,所有上述工作都不会起作用:

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

所以:

  1. 设置UIViewControllerBasedStatusBarAppearanceYES.plist
  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

6

奇怪,使用Swift 3.1和XC8.2.1,但以上所有方法均无效。

我所做的只是

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

没有Plist,没有其​​他东西。高温超导


同样适用于Swift 4.2。
zeeshan


1

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

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

1

步骤1.添加到info.plist View controller-based status bar appearance -> NO

步骤2.在需要更改状态栏颜色的方法中添加代码:

UIApplication.shared.statusBarStyle = .lightContent //(or .default)
setNeedsStatusBarAppearanceUpdate()

关键代码行: setNeedsStatusBarAppearanceUpdate()

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.