首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在视图控制器中使用overrideUserInterfaceStyle快速更改模式不会更新UIView中的UITraitCollection.current.userInterfaceStyle。

在视图控制器中使用overrideUserInterfaceStyle快速更改模式不会更新UIView中的UITraitCollection.current.userInterfaceStyle。
EN

Stack Overflow用户
提问于 2021-03-01 18:34:46
回答 1查看 612关注 0票数 0

在此视图控制器中,有一个按钮使用以下代码在光模式和暗模式之间进行更改:

代码语言:javascript
复制
@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语句只会一次又一次地打印出默认值。

代码语言:javascript
复制
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转换成一个图像,并将其作为一个图层添加到地图中。因为它是一个图像,所以它不会更新颜色。因此,我必须完全擦除地图,并添加注释回来,以获得正确的外观。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-03-01 21:07:17

这个问题源于当我初始化UIView时,它没有父级,所以它没有地方读取traitCollection,转而使用系统设置。修复方法是从userInterfaceStyle中传入viewController,并在CustomAnnotationView初始化器中调用self.overrideUserInterfaceStyle。希望这能帮助其他遇到这种问题的人。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66427687

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档