问题描述
在这个视图控制器中,有一个按钮可以使用以下代码在明暗模式之间切换:
@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
。希望这对遇到此类问题的其他人有所帮助。