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



如何在 iOS 应用程序中切换以编程方式更改为深色或浅色模式? 我正在使用 Swift。

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

window.overrideUserInterfaceStyle = .dark

我想更详细地阐述@Frank Schlegel提供的答案。

要从应用程序中的另一个视图控制器更改主题(我认为这是您最初要求的(,您可以为将触发更改的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
}
}
}

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

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

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

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

这会将该theme值的观察者置于UserDefaults中。

若要处理更改,需要将此方法添加到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")

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

window.overrideUserInterfaceStyle = .dark

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

最新更新