You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 13:06:00