xcode 如何以编程方式切换到暗模式swift

pprl5pva  于 2023-02-13  发布在  Swift
关注(0)|答案(3)|浏览(181)

如何在iOS应用程序中通过编程方式切换到暗模式或亮模式?我使用的是Swift。

3lxsmp7m

3lxsmp7m1#

你可以使用overrideUserInterfaceStyle属性覆盖单个视图或视图控制器的样式,但由于窗口也是一个视图,你可以在主窗口上设置它,强制它进入亮或暗模式:

window.overrideUserInterfaceStyle = .dark
klsxnrf1

klsxnrf12#

我想对“弗兰克·施莱格尔”提供的答案进行更详细的阐述。
要从应用中的另一个视图控制器更改主题(我认为这是您最初要求的),您可以为将触发更改的UserDefaults值添加观察器。
我将添加枚举以更好地表示主题状态

enum Theme: String {
    case light, dark, system

    // Utility var to pass directly to window.overrideUserInterfaceStyle
    var uiInterfaceStyle: UIUserInterfaceStyle {
        switch self {
        case .light:
            return .light
        case .dark:
            return .dark
        case .system:
            return .unspecified
        }
    }
}

SceneDelegate中,在window初始化下,必须添加每次UserDefaults更改值时触发的此方法。

UserDefaults.standard.addObserver(self, forKeyPath: "theme", options: [.new], context: nil)

此外,如果您希望在取消初始化SceneDelegate时删除该观察器,请添加

deinit {
    UserDefaults.standard.removeObserver(self, forKeyPath: "theme", context: nil)
}

这将在UserDefaults中放置该theme值的观察者。
要处理更改,需要将此方法添加到SceneDelegate类中。

override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey: Any]?, context: UnsafeMutableRawPointer?) {
    guard
        let change = change,
        object != nil,
        keyPath == Defaults.theme.rawValue,
        let themeValue = change[.newKey] as? String,
        let theme = Theme(rawValue: themeValue)?.uiInterfaceStyle
    else { return }

    UIView.animate(withDuration: 0.3, delay: 0.0, options: .curveLinear, animations: { [weak self] in
        self?.window?.overrideUserInterfaceStyle = theme
    }, completion: .none)
}

每次theme值在UserDefaults中更改时都会执行此操作,并将从一个主题转换为另一个主题。
现在,要从应用中的其他视图控制器更改主题,您只需更改UserDefaults的值。

UserDefaults.standard.setValue(Theme.light.rawValue, forKey: "theme")
ivqmmu1c

ivqmmu1c3#

您可以使用其中一种观察方式,例如Defaults lib,然后添加

window.overrideUserInterfaceStyle = .dark

func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {}

相关问题