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

使用上述代码在任何ViewController中为特定的ViewController设置状态栏颜色为白色,在iOS8中对我来说是行不通的。有什么建议吗?使用UIApplication。shared应用方法,在信息中需要更改后颜色更改。Plist为整个应用程序。

// Change the colour of status bar from black to white
UIApplication.sharedApplication().statusBarStyle = .LightContent

我怎么能改变一些必要的和特定的视图控制器的状态栏颜色?


当前回答

斯威夫特4.2 嘿,我想分享一个解决方案,我从格雷格·格鲁米特的一篇关于这个神秘主题的好文章中得到的。

步骤1 正如其他人所提到的,添加到你的PLIST

View controller-based status bar appearance YES

步骤2在RootViewcontroller中添加如下

var statusBarHidden: Bool = false {
        didSet(newValue) {
            UIView.animate(withDuration: 0.1) {
                self.setNeedsStatusBarAppearanceUpdate()
            }
        }
    }

    override var prefersStatusBarHidden: Bool {
        return statusBarHidden
    }

    var vcStatusBarStyle: UIStatusBarStyle = .default {
        didSet(newValue) {
            UIView.animate(withDuration: 0.1) {
                self.setNeedsStatusBarAppearanceUpdate()
            }
        }
    }

    override var preferredStatusBarStyle: UIStatusBarStyle {
        return vcStatusbarStyle
    }

当更新属性statusBarHidden或vcStatusBarStyle时,它将调用setNeedsStatusBarAppearanceUpdate(),并将更新状态栏与prefersStatusBarHidden或preferredStatusBarStyle的新值。在我的情况下,我必须为容器视图控制器更新这些属性,这是可见的子视图控制器的父。我使用一个简单的委托方法做到了这一点。

protocol MainViewControllerDelegate {
    func updateStatusBarStyle(statBarStayle: UIStatusBarStyle)
    func toggleStatusBar(visable: Bool)
}

当然,当实例化childViewController(Visible VC)时,不要忘记将MainViewcontroller(Container VC)设置为它的委托。我有时会。:)

childViewController.delegate = self

然后在childViewController中,当需要更新状态栏时,我只调用委托方法。

self.delegate?.updateStatusBarStyle(statBarStayle: .default)

如上所述,Graig Grummitt详细介绍了这个解决方案,也与UINavigationControllers一起工作。链接这里:状态栏的神秘案例

其他回答

实现preferredStatusBarStyle,如你所述,并调用self.setNeedsStatusBarAppearanceUpdate()在ViewDidLoad和 也在信息。设置UIViewControllerBasedStatusBarAppearance为YES(默认是YES)

目前还不清楚为什么它不起作用。我需要检查代码。另一个建议是 使用viewDidLoad UIApplication.sharedApplication()中的工作代码。statusBarStyle = . lightcontent,并将此更改为默认值,当您查看viewgetdisappear viewWillDisappear。

我遵循了这个教程,它对我很有效。然而,我不确定是否有任何警告。

https://coderwall.com/p/dyqrfa/customize-navigation-bar-appearance-with-swift

打开你的信息。Plist和set UIViewControllerBasedStatusBarAppearance设为false。 在AppDelegate.swift中的第一个函数中,它包含didFinishLaunchingWithOptions,设置你想要的颜色。

UIApplication.sharedApplication()。statusBarStyle = UIStatusBarStyle。LightContent

Swift 3更新* 共享。statusbarstyle = .lightContent

(截至2020年6月10日)

Swift 5(不编辑。plist文件)

如果你正在使用故事板,转到导航控制器,选择导航栏,单击属性检查器,然后更改样式。如果你需要浅色内容(白色状态栏),设置它除了默认设置样式黑色,如果你想要深色内容(黑色状态栏),设置它默认。

默认的(UIBarStyleDefault)导致前景UIStatusBarStyleDefault状态栏为黑色。UIBarStyleBlack会给出一个uistatusbarstyelightcontent状态栏。

编程

let nav = UINavigationController(rootViewController: rootViewController)

    nav.navigationBar.barStyle = .default //gives you dark Content status bar

    nav.navigationBar.barStyle = .black  //gives you light content status bar

没有导航栏(编辑。plist)

添加UIViewControllerBasedStatusBarAppearance /基于视图控制器的状态栏外观到你的信息。Plist, set value为true。

重写控制器中的preferredStatusBarStyle属性

class ViewController: UIViewController {
    override var preferredStatusBarStyle : UIStatusBarStyle {
        return .lightContent
    }
}

请在“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 }

iOS 13

 var statusBarView: UIView = UIView()
        if #available(iOS 13.0, *) {
            let tag:UInt64 = 38482458385
            if let statusBar = UIApplication.shared.keyWindow?.viewWithTag(Int(tag)) {
                statusBar.backgroundColor = UIColor.red
                statusBarView = statusBar
            } else {
                let statusBar = UIView(frame: UIApplication.shared.statusBarFrame)
                statusBar.tag = Int(tag)
                UIApplication.shared.keyWindow?.addSubview(statusBar)
                statusBarView = statusBar
            }
        } else {
            statusBarView = (UIApplication.shared.value(forKey: "statusBar") as? UIView)!
            if statusBarView.responds(to: #selector(setter: UIView.backgroundColor)){
                statusBarView.backgroundColor = UIColor.red
            }
        }

对我有用的是,在故事板中,转到导航控制器,选择导航栏,单击属性检查器,然后将默认样式改为黑色。就是这样!