我想在.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起已弃用,所以我不能再使用它。
任何人都知道如何动态更改此内容?
答案 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
答案 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
}