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

16

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

我已经尝试过创建一个如下所示的函数:

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

但是没有运气。我在网上找到的每个指南(或在Stackoverflow上找到的)都只显示如何通过函数一次性更改状态栏,而不是打开和关闭。

我还将View controller-based status bar appearance设置为NOinfo.plist文件中。

我曾经使用的代码行是UIApplication.shared.statusBarStyle = .lightContent - 但由于自iOS9以来已过时,所以我不能再使用它了。

有人有什么想法可以实现动态更改状态栏吗?

3个回答

39
创建一个类型为 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

输入图像描述


我在一个新项目中尝试了这个方法,结果完美无缺!但我的现有应用程序中override var preferredStatusBarStyle: UIStatusBarStyle { return self.style }没有被调用来进行更改...你们有什么想法吗?同时var style : UIStatusBarStyle = .defaultsetNeedsStatusBarAppearanceUpdate()也被调用了。 - Giovanni Palusa
1
非常感谢,这是一个很棒的解决方案! - unixb0y
@bsod变量style不是全局变量。它是ViewController类的实例属性。 - RajeshKumar R
1
这对我来说完美地运作了......使用 .black 来设置状态栏的白色,使用 .default 来设置状态栏的黑色。 - Kedar Sukerkar

5
我希望以下代码适用于您的需求(适用于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
   }

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
}

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