76
  • 如何在 iOS 应用中观察暗模式状态
  • 如何对 iOS 应用程序中暗模式状态的变化做出反应
4

2 回答 2

142

UIKit 已经有一段时间了。从 iOS 9 开始,您可以使用 UITraitCollection 来查看设备是否支持 3D Touch(另一天的悲伤对话)

在 iOS 12中,UITraitCollection 有了一个新属性:var userInterfaceStyle: UIUserInterfaceStyle它支持三种情况:lightdarkunspecified

由于 UIViewController 继承了 UITraitEnvironment,因此您可以访问 ViewController 的traitCollection. 这家店userInterfaceStyle

UITraitEnviroment 还有一些漂亮的协议存根,可以帮助您的代码解释何时发生状态更改(因此当用户从黑暗面切换到光明面时,反之亦然)。这是一个很好的编码示例:

class MyViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        if self.traitCollection.userInterfaceStyle == .dark {
            // User Interface is Dark
        } else {
            // User Interface is Light
        }

    }


    override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
        // Trait collection has already changed
    }

    override func willTransition(to newCollection: UITraitCollection, with coordinator: UIViewControllerTransitionCoordinator) {
        // Trait collection will change. Use this one so you know what the state is changing to.
    }
}

于 2019-06-05T09:15:15.850 回答
62

您可以使用以下代码检查项目中的亮模式或暗模式:

func viewDidLoad() {
    super.viewDidLoad()

    switch traitCollection.userInterfaceStyle {
        case .light, .unspecified:
            // light mode detected
        case .dark:
            // dark mode detected
    }
}

您还可以检查界面样式的更改:

override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
    super.traitCollectionDidChange(previousTraitCollection)

    let userInterfaceStyle = traitCollection.userInterfaceStyle // Either .unspecified, .light, or .dark
    // Update your user interface based on the appearance
}

就像自 Mojave 以来在 macOS 中一样,您可以在资产目录中为明暗模式定义图像,以便自动使用这些图像:

资产目录

取自这里

于 2019-06-05T09:12:28.833 回答