iOS端Google Maps随系统深浅色切换无法实时更新mapStyle问题
问题根因
- 你在
UIViewRepresentable结构体中自行存储了GMSMapView实例,这是错误用法。UIViewRepresentable属于值类型,每次视图状态变化(比如深浅色切换触发重绘)时都会生成新的结构体实例,你存储的mapView属性会被反复初始化,和系统实际持有的、正在界面渲染的地图实例不是同一个对象,修改这个存储属性的样式自然不会作用到界面上。 applyColorSchemeToMap方法直接操作自行存储的无效实例,没有使用updateUIView传入的当前活跃地图实例,导致样式更新没有命中正确对象。
修复代码
struct MapView: UIViewRepresentable { @Environment(\.colorScheme) var colorScheme private let defaultZoomLevel: Float = 10 func makeUIView(context: Context) -> GMSMapView { // 仅在makeUIView内创建地图实例,由系统持有管理生命周期 let mapView = GMSMapView(frame: .zero) mapView.delegate = context.coordinator applyColorSchemeToMap(mapView: mapView) return mapView } func updateUIView(_ mapView: GMSMapView, context: Context) { // 深浅色切换时系统会触发updateUIView,直接使用传入的活跃实例更新样式 applyColorSchemeToMap(mapView: mapView) } // 接收活跃地图实例作为入参,确保样式修改作用到当前显示的地图 func applyColorSchemeToMap(mapView: GMSMapView) { do { let styleName = colorScheme == .dark ? "night_map_style" : "map_style" guard let styleURL = Bundle.main.url(forResource: styleName, withExtension: "json") else { NSLog("无法找到样式文件:\(styleName).json") return } // 显式指定主线程执行,避免极端情况下线程异常导致样式不生效 DispatchQueue.main.async { mapView.mapStyle = try GMSMapStyle(contentsOfFileURL: styleURL) } } catch { NSLog("地图样式加载失败:\(error)") } } // 原代码缺失的Coordinator实现,根据自身业务需求补充即可 func makeCoordinator() -> Coordinator { Coordinator() } class Coordinator: NSObject, GMSMapViewDelegate {} }
补充校验
如果修改后仍有异常,可检查深浅色对应的两个JSON样式文件是否都已正确添加到目标的Build Phases > Copy Bundle Resources列表中,避免文件缺失导致样式加载失败。
内容的提问来源于stack exchange,提问作者Angus
相关产品推荐
相关产品推荐

