在Swift 4中动态更改状态栏颜色

时间:2018-06-26 12:25:20

标签: ios swift

我想在.lightContent.default之间动态更改状态栏颜色(因为我的背景可以在同一ViewController中更改)。

我试图为此创建一个函数,如下所示:

func changeStatusBar(useDefault: Bool) {
    if useDefault {
        var preferredStatusBarStyle: UIStatusBarStyle {
            return .default
        }
    } else {
        var preferredStatusBarStyle: UIStatusBarStyle {
            return .lightContent
        }
    }
    setNeedsStatusBarAppearanceUpdate()
}

但是没有运气。我在网上找到的每本指南(或在Stackoverflow上找到的每本指南)仅显示了一次更改statusBar的方法,而不是通过一个函数来打开和关闭。

我还在View controller-based status bar appearance文件中将NO设置为info.plist

我以前使用的行是UIApplication.shared.statusBarStyle = .lightContent-但由于自iOS9起已弃用,所以我不能再使用它。

任何人都知道如何动态更改此内容?

3 个答案:

答案 0 :(得分:17)

使用UIStatusBarStyle类型创建一个变量,然后在preferredStatusBarStyle中返回它

您可以随时更改其值,并致电setNeedsStatusBarAppearanceUpdate()

class ViewController: UIViewController {

    override var preferredStatusBarStyle: UIStatusBarStyle {
        return self.style
    }
    var style:UIStatusBarStyle = .default

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    @IBAction func changeStyle(_ sender: UIButton) {
        if self.style == .lightContent {
            self.style = .default
        } else {
            self.style = .lightContent
        }
        setNeedsStatusBarAppearanceUpdate()
    }
}
override var preferredStatusBarStyle: UIStatusBarStyle { return self.style }
     

如果您将视图控制器嵌入到   导航控制器您应该更改导航控制器的栏样式

self.navigationController?.navigationBar.barStyle = //newStyle

enter image description here

答案 1 :(得分:3)

我希望以下代码可以满足您的需要(对于Swift4):

override func viewDidLoad() {
    super.viewDidLoad()

    let statusBar = UIApplication.shared.value(forKey: "statusBar") as? UIView
    if statusBar?.responds(to: #selector(setter: UIView.backgroundColor)) ?? false {
        statusBar?.backgroundColor = .green
    }
}

或者,您可以尝试以下操作:

   if let StatusbarView = UIApplication.shared.value(forKey: "statusBar") as? UIView {
                StatusbarView.backgroundColor = .green
   }

答案 2 :(得分:1)

覆盖preferredStatusBarStyle并在需要更新时调用setNeedsStatusBarAppearanceUpdate()。在我的示例中,我使用了由布尔属性useDarkMode控制的简单暗模式。更改后,UI就会更新(包括状态栏):

var useDarkMode = false {
    didSet {
        if useDarkMode != oldValue {
            updateUI()
        }
    }
}

private func updateUI() {
    UIView.animate(withDuration: 0.25) {
        if self.useDarkMode {
            self.view.backgroundColor = .darkGray
            self.view.tintColor = .white
        } else {
            self.view.backgroundColor = .white
            self.view.tintColor = nil
        }

        self.setNeedsStatusBarAppearanceUpdate()
    }
}

override var preferredStatusBarStyle: UIStatusBarStyle {
    return useDarkMode ? .lightContent : .default
}