0

我通过添加更新了我的应用程序中的视图以支持暗模式

        if #available(iOS 12.0, *) {
           if self.traitCollection.userInterfaceStyle == .dark {
               //Adapt to dark Bg
           } else {
                //Adapt to light Bg
            }
        }

然后,为了考虑到用户在应用程序后台运行并在切换模式后返回应用程序的情况,我在 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没有区别。

4

1 回答 1

4

您不需要所有那些凌乱的 if 语句!只需将您的颜色添加到您的资产目录,就会自动选择正确的颜色。这类似于您如何添加x1,x2x3图像,并且将选择正确的图像。

转到资产目录并在左下角单击加号按钮,选择“新颜色集”:

在此处输入图像描述

为颜色命名,并在属性检查器中,将“外观”设置为“任何、深色”:

在此处输入图像描述

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

在此处输入图像描述

最后,使用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
    }
}
于 2020-03-01T14:55:47.923 回答