【问题标题】:How can I change the appearance of the status bar?如何更改状态栏的外观?
【发布时间】:2019-02-11 17:20:00
【问题描述】:

我正在尝试根据用户默认值更改此处状态栏的外观,用户默认值会检测用户是否打开了模式,但使用setNeedsStatusBarAppearanceUpdate() 不起作用。我将默认状态栏设置为 Light。 这是我目前正在使用的代码:

var darkModeOn: Bool! 

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

    let isDarkMode = UserDefaults.standard.bool(forKey: "isDarkMode")  // Retrieve the state

    if isDarkMode == false{

        UserDefaults.standard.set(false, forKey: "isDarkMode")
        UIApplication.shared.statusBarStyle = .default
        view.backgroundColor = UIColor.white

    }else{

        UserDefaults.standard.set(true, forKey: "isDarkMode")
        UIApplication.shared.statusBarStyle = .lightContent
        view.backgroundColor = UIColor(red: 35/255, green: 35/255, blue: 35/255, alpha: 1)


    }

}

我已经尝试过使用

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

但只显示灯光状态栏

【问题讨论】:

  • 在您的 Info.plist 文件中,您是否将“查看基于控制器的状态栏外观”设置为“是”?
  • 在info.plist视图中基于控制器的状态栏外观设置为No

标签: ios swift nsuserdefaults statusbar


【解决方案1】:

在 Info.plist 中,将“查看基于控制器的状态栏外观”设置为 YES。如果它设置为 NO 那么它会将默认值应用于所有视图控制器。

一旦设置为yes,使用它来覆盖每个视图控制器的外观:

override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
    //or return .default
}

【讨论】:

    【解决方案2】:

    试试这个,它对我有用:

    1. 在 Info.plist 中,将 UIViewControllerBasedStatusBarAppearance 设置为 YES
    2. 覆盖preferredStatusBarStyle

      override var preferredStatusBarStyle: UIStatusBarStyle { return UserDefaults.standard.bool(forKey: "isDarkMode") ? .lightContent : .default }

    但是,如果此视图控制器嵌入在导航控制器中,则覆盖将被忽略,因此您必须改用以下代码:

    self.navigationController?.navigationBar.barStyle = UserDefaults.standard.bool(forKey: "isDarkMode") ? .black : .default
    

    希望对你有帮助

    【讨论】:

    • 奇怪的是,UI 似乎没有更新。如果我启动应用程序,状态栏样式将根据我在项目设置中设置的内容进行设置。如果我设置为默认总是黑色,如果设置为 lightContent 总是白色,我将 UIViewControllerBasedStatusBarAppearance 设置为 Yes
    • 这个视图控制器是否在导航控制器堆栈中?我的意思是你“推动”它还是“呈现”它? @GiovanniFilippini
    • 主界面是的,但是设置页面没有。这是我的故事板的图像:dropbox.com/s/jrl39ncnmbup5o1/…
    • 我更新了我的答案。如果这仍然不起作用,那么我不知道为什么(对不起:()。还要确定您在 UserDefault 中的值,当您想在运行时更新栏样式时使用 setNeedsStatusBarAppearanceUpdate()。祝您好运!
    猜你喜欢
    • 2012-11-23
    • 2015-11-01
    • 2013-09-23
    • 1970-01-01
    • 1970-01-01
    • 2020-04-06
    • 1970-01-01
    • 2017-06-09
    • 1970-01-01
    相关资源
    最近更新 更多