在iOS上打开应用后,如何允许用户更改为暗或亮模式?

时间:2020-03-01 14:31:48

标签: swift ios-darkmode background-foreground uitraitcollection

我已经通过添加

更新了应用中的视图以支持暗模式
        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没什么区别。

1 个答案:

答案 0 :(得分:3)

您不需要所有那些凌乱的if语句!只需将颜色添加到“资产目录”中,就会自动选择正确的颜色。这类似于添加x1x2x3图像的方式,然后将选择正确的图像。

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

enter image description here

给颜色命名,然后在属性检查器中将“外观”设置为“任意,黑暗”:

enter image description here

为每种外观选择颜色:

enter image description here

最后,使用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
    }
}