我通读了关于以下内容的文档:https://developer.apple.com/documentation/appkit/supporting_dark_mode_in_your_interface

当用户更改系统外观时,系统会自动要求每个窗口和视图重新绘制自身.在此过程中,系统会为macOS和iOS调用下表中列出的几种众所周知的方法来更新您的内容.

在遗留应用程序中,我们在每个类的init中创建视图作为惰性变量.这意味着,如果用户进入"设置"并切换到"暗模式",视图将无法以正确的 colored颜色 绘制出来.

如果您在这些方法之外进行外观敏感的更改,您的应用程序可能无法针对当前环境正确绘制其内容.解决方案是将代码移动到这些方法中.

我们的应用程序相当大,future 将进行重构以更好地支持这一点,但我想知道是否有一种方法可以通过通知中心检测到这种变化,比如可以为Mac OS做什么:

How to detect switch between macOS default & dark mode using Swift 3

推荐答案

Swift 5:

traitCollectionDidChange也会接到几次电话.这就是我如何检测DarkMode运行时更改和设置 colored颜色 ().

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

        setColors()
    }

在setColors()函数中,我更新 colored颜色 .

extension UIViewController {
    var isDarkMode: Bool {
        if #available(iOS 13.0, *) {
            return self.traitCollection.userInterfaceStyle == .dark
        }
        else {
            return false
        }
    }

}

我有这样定义的 colored颜色 (适用于iOS<;13):

enum ColorCompatibility {
    static var myOlderiOSCompatibleColorName: UIColor {
        if UIViewController().isDarkMode {
            return UIColor(red: 33, green: 35, blue: 37, alpha: 0.85)
        }
        else {
            return UIColor(hexString: "#F3F3F3", alpha: 0.85)
        }
    }
}

例子:

private func setColors() {
  myView.backgroundColor = ColorCompatibility.myOlderiOSCompatibleColorName
}

此外,您可能需要在ViewDidLoad/Will/DidAppear中调用SetColor,具体情况如下:

viewDidLoad() {
...
setColors()
...
}

对于iOS11+,您可以使用"命名 colored颜色 ",这是在assets资源 中定义的,在IB中更容易使用.

干杯

Swift相关问答推荐

阴影动画的动画不流畅

Swift-Can无法在AudioKit中找出简单的麦克风效果-文件链

通常从数组调用的SWIFT静态协议函数

NavigationLink和ObservableObject的动画片段

Swift中从头开始的基本HTTP客户端

expose 不透明的底层类型

UIView.convert(_ point:to:)的意外行为

在Equatable上引用运算符函数==要求Dictionary.Values符合Equatable

SwiftUI 无法在实时活动中显示 SpriteView

如何在 UITableView 中点击图片和标题

为 SwiftUI 中的属性提供默认值

签署GoogleSignIn-GoogleSignIn需要开发团队

单击按钮后的计时器发布者初始化计时器

Subclass.fetchRequest() Swift 3.0,扩展并没有真正帮助 100%?

如何使用 swift 将 Images.xcassets 中的图像加载到 UIImage 中

将活动指示器 colored颜色 更改为黑色

如何在 SwiftUI 中为删除和禁用配置 ContextMenu 按钮?

如何在 SwiftUI 中的一个视图上显示两个alert ?

swift - 我可以从我的自定义初始化方法中调用 struct 默认成员初始化吗?

swift上的UIImage无法判断nil