您如何允许用户在 iOS 打开应用程序时更改为深色或浅色模式?

How can you allow for a user changing to dark or light mode with the app open on iOS?

我更新了应用中的视图以通过添加

支持深色模式
        if #available(iOS 12.0, *) {
           if self.traitCollection.userInterfaceStyle == .dark {
               //Adapt to dark Bg
           } else {
                //Adapt to light Bg
            }
        }

然后,为了允许用户在切换模式后将应用程序设置为后台并returns到它的情况,我在我的 viewDidLoad

中附加了一个观察者
        if #available(iOS 12.0, *) {
            NotificationCenter.default.addObserver(self, selector: #selector(willEnterForeground), name: UIApplication.willEnterForegroundNotification, object: nil)
        } else {
            // Fallback on earlier versions
        }

触发函数

    @available(iOS 12.0, *)
    @objc func willEnterForeground() {
        if self.traitCollection.userInterfaceStyle == .dark {
            print("App moving to foreground - dark")
            //Adapt to dark Bg
        } else {
            print("App moving to foreground - light")
            //Adapt to light Bg
        }
    }

但是,self.traitCollection.userInterfaceStyle 仍然提供旧值,因此需要完全重新加载视图才能对界面产生所需的更新。 使用 UIApplication.didBecomeActiveNotification 没有区别。

您不需要所有那些混乱的 if 语句!只需将您的颜色添加到资产目录中,系统就会自动 select 编辑正确的颜色。这与添加 x1x2x3 图像的方式类似,正确的图像将被 selected。

转到资产目录,然后单击左下角的加号按钮,select "New Color Set":

给颜色命名,然后在 属性 检查器中,将 "Appearance" 设置为 "Any, Dark":

为每种外观选择一种颜色:

最后,使用 UIColor(named:) 初始化程序初始化颜色,当设备的暗模式设置更改时它们会自动更改:

someView.backgroundColor = UIColor(named: "myColor")

编辑:

如果颜色仅在运行时已知,您可以使用 init(dynamicProvider:) 初始化器(iOS 13 仅):

someView.backgroundColor = UIColor {
    traits in
    if traits.userInterfaceStyle == .dark {
        // return color for dark mode
    } else {
        // return color for light mode
    }
}