【问题标题】:How to change app theme (Light/Dark) programmatically in swift 5如何在 Swift 5 中以编程方式更改应用程序主题(浅色/深色)
【发布时间】:2021-05-29 03:36:25
【问题描述】:

我有一个最多有 10 个屏幕的应用程序,在设置屏幕中,我可以在暗/亮模式之间切换。我想更改该切换上的完整应用主题。

目前,当我在 iOS 默认设置中更改主题时,应用程序主题会发生变化。但我希望仅在我的应用上发生相同的行为。

到目前为止,我想的是在用户默认值中设置一个主题变量,并在每个视图控制器上使用此代码

    view.overrideUserInterfaceStyle = // .dark // .light

我不想使用任何第三方库。

【问题讨论】:

  • 覆盖窗口的界面样式应该覆盖它的所有子视图。

标签: ios swift iphone macos swift5


【解决方案1】:

在您的应用委托didFinishLaunchingWithOptions 中从共享默认值中读取首选项并执行以下操作:

UIApplication.shared.keyWindow.overrideUserInterfaceStyle = preference == "dark" ? .dark : .light

当用户更改首选项时,在您的设置视图控制器中执行相同操作。

在你的窗口上设置覆盖应该照顾所有的视图控制器。

【讨论】:

  • 感谢您的回答,它在我的设置屏幕中运行良好,并按预期更改了应用程序主题。但是当我关闭应用程序并在我的 didfinish 函数中重新打开它时,它并没有改变它们。它使用默认的 ios 主题。我该怎么办?
  • 当我将主题条件放在我的场景委托文件中时它可以工作。但是,您的回答对我很有帮助,非常感谢。
【解决方案2】:

这是我在类似用例上采用相同方法的方法。我为AppDelegate 创建了一个扩展,如下所示:

extension AppDelegate {
    func overrideApplicationThemeStyle() {
        if #available(iOS 13.0, *) {
            ....
            // Retrieve your NSUserDefaults value here
            ....
            UIApplication.shared.keyWindow?.overrideUserInterfaceStyle = yourUserDefaultsValue ? .dark : .light
        } else {
            // Fallback on earlier versions
        }
    }
}

而且,我的主题更改是特定于设备的。所以,我在NSUserDefaults 中创建了一个布尔实例来保持切换更改。而且,每当切换开关发生变化时,我都会调用该方法:

@IBAction func changeApplicationTheme() {
    ....
    // Your code to store the changes in NSUserDefaults
    ....
    AppDelegate.shared.overrideApplicationStyle()
}

而且,更重要的是,这个主题是从 iOS 13 开始引入的,这是在应用启动并希望应用用户选择的主题时从 func sceneDidBecomeActive(_ scene: UIScene) 调用它的最佳位置。

func sceneDidBecomeActive(_ scene: UIScene) {
    AppDelegate.shared.overrideApplicationStyle()
}

【讨论】:

    猜你喜欢
    • 2021-03-19
    • 2023-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-13
    • 1970-01-01
    • 1970-01-01
    • 2022-08-12
    相关资源
    最近更新 更多