Swift - 在视图控制器中使用 overrideUserInterfaceStyle 更改模式不会更新 UIView 中的 UITraitCollection.current.userInterfaceStyle

问题描述

在这个视图控制器中,有一个按钮可以使用以下代码在明暗模式之间切换:

@IBAction func toggleModeButtonAction(_ sender: Any) {
    if let appDelegate = UIApplication.shared.delegate,let window = appDelegate.window,let unwrappedWindow = window {
        unwrappedWindow.overrideUserInterfaceStyle = traitCollection.userInterfaceStyle == .dark ? .light : .dark
    }
    ...
}

视图控制器内部有一个 mapBox 地图视图,其中包含我通过图层添加的注释。并且当上面的函数执行时,它会清除地图和注释并重新添加它们。

问题出在这个注释视图中,当我尝试根据 userInterfaceStyle 更新背景颜色时,该样式始终停留在设备系统外观(无论用户加载的哪个)并且不会更新。您在那里看到的打印语句只会一遍又一遍地打印出认值。

class CustomAnnotationView: MGLAnnotationView {
    init() { ... }

    override func draw(_ rect: CGRect) {
        ...

        print("-----> \(uitraitcollection.current.userInterfaceStyle.rawValue)")
        let fillColor: UIColor = uitraitcollection.current.userInterfaceStyle == .dark ? .orange : .darkgrey

        ...
    }
}

如何让这个视图检索 overrideUserInterfaceStyle 样式?当我添加它时,这里的 traitCollectionDidChange 函数也永远不会执行(大概是因为每次都从头开始创建注释,这是有道理的)。

我不只是将颜色设置为根据 userInterfaceStyle 在颜色之间变化的系统颜色,是因为我最终将此 annotationView 投射到我作为图层添加到地图的图像中。因为它是一个图像,它不会更新颜色。所以我必须完全擦除地图并重新添加注释以获得正确的外观。

解决方法

该问题源于 UIView 在我初始化时没有父级,因此它无处可读取 traitCollection 并退回到使用系统设置。修复方法是从 viewController 传入 userInterfaceStyle 并在 CustomAnnotationView 初始值设定项中调用 self.overrideUserInterfaceStyle。希望这对遇到此类问题的其他人有所帮助。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...