UIStatusBarStyle 没有改变

UIStatusBarStyle doesn't change

我正在开发 swift 应用程序,我想根据应用程序的主题更改 UIStatusBarStyle(有 2 个选项 - 浅色和深色主题)。我在 info.plist 中将 View controller-based status bar appearance 设置为 NO,在 UIViewController 中我尝试根据当前主题设置它,如下所示:

override var preferredStatusBarStyle: UIStatusBarStyle {
    return Theme.current.statusBarStyle
}


protocol ThemeProtocol { 
    // Status Bar
    var statusBarStyle: UIStatusBarStyle { get } 
}

class Theme {
    static var current: ThemeProtocol = LightTheme()
}

class LightTheme: ThemeProtocol {
    // Status Bar 
    var statusBarStyle: UIStatusBarStyle = .default

}

class DarkTheme: ThemeProtocol {
    // Status Bar 
    var statusBarStyle: UIStatusBarStyle = .lightContent

}

真的没有结果。我试图通过仅返回来测试它: return .lightContent 但这也没有改变状态栏。

我做错了什么?

更新:

好的,这就是我正在尝试做的,但它不起作用。

    fileprivate func applyTheme() {

    statusBarStyle = UserDefaults.standard.bool(forKey: SelectedThemeKey) ? .default : .lightContent
    self.setNeedsStatusBarAppearanceUpdate()

}

override var preferredStatusBarStyle: UIStatusBarStyle {
    return statusBarStyle
}

它不起作用。尽管更改了主题,但状态栏始终保持默认样式。 applyTheme()viewDidLoad()viewWillAppear()

中调用

您需要在任何更改后调用此方法

setNeedsStatusBarAppearanceUpdate()

//

class ViewController: UIViewController {

    var current = UIStatusBarStyle.default

    @IBAction func changeClicked(_ sender: Any) {
        current = current == .default ? .lightContent : .default
        self.setNeedsStatusBarAppearanceUpdate()
    }
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }
    override  var preferredStatusBarStyle: UIStatusBarStyle {
        return current
    }

}

首先,你的代码毫无意义。你说

I have set View controller-based status bar appearance to NO in the info.plist and in the UIViewController I tried to set it

所以一方面你告诉运行时,不要听我的视图控制器。然后当运行时不听你的视图控制器时你抱怨!

其次,请记住,您的视图控制器在状态栏外观中没有发言权,除非它是顶级视图控制器(或顶级视图控制器故意遵从它)。例如,如果您的视图控制器位于导航控制器内,则它的 statusBarStyle 完全无关紧要。

第一个

如果您尝试将 StatusBarStyle 更改为 UIApplication.shared.statusBarStyle = .default,那么您应该设置 View controller-based status bar appearance 变为 NO.

这样,处处需要UIApplication.shared.statusBarStyle自己掌控;例如 viewWillAppear / viewWillDisappear.

但此方法在 iOS 9.

之后被弃用

现在我建议你学习新方法:

请将View controller-based status bar appearance设为YES

覆盖 UIViewControllerpreferredStatusBarStyle 来处理它。

override var preferredStatusBarStyle: UIStatusBarStyle {
    return .default
}

但还是不行,为什么?

在你的情况下,我猜 UIViewControllerUINavigationControllerviewControllers 之一。

如果您使用了 UINavigationController,您应该覆盖 UINavigationController 中的 preferredStatusBarStyle

也许你会说我需要为不同的视图控制器设置不同的状态栏样式,没关系。

只需像这样覆盖 UINavigationController 中的 childForStatusBarStyle

override var childForStatusBarStyle: UIViewController? {
    return topViewController
}

然后覆盖 UIViewController 您想要更改的 preferredStatusBarStyle

你也可以像这样extension

extension UINavigationController {
    override open var childForStatusBarStyle: UIViewController? {
        return topViewController
    }
}