在此视图控制器中,有一个按钮使用以下代码在光模式和暗模式之间进行更改:
@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更新背景色时,样式总是粘在设备系统的外观上(不管用户加载哪种颜色),并且不更新。在那里看到的print语句只会一次又一次地打印出默认值。
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转换成一个图像,并将其作为一个图层添加到地图中。因为它是一个图像,所以它不会更新颜色。因此,我必须完全擦除地图,并添加注释回来,以获得正确的外观。
发布于 2021-03-01 21:07:17
这个问题源于当我初始化UIView时,它没有父级,所以它没有地方读取traitCollection,转而使用系统设置。修复方法是从userInterfaceStyle中传入viewController,并在CustomAnnotationView初始化器中调用self.overrideUserInterfaceStyle。希望这能帮助其他遇到这种问题的人。
https://stackoverflow.com/questions/66427687
复制相似问题