Actualizar el estilo del mapa de iOS en Google Maps al cambiar el esquema de color del entorno (modo oscuro).
Cuando cambio la configuración del dispositivo entre el modo claro y el modo oscuro, mi estilo de mapa de Google Maps no se actualiza. Las otras vistas cambian correctamente al modo seleccionado, solo el mapa no cambia.
El estilo de mapa cambia correctamente cuando reinicio mi aplicación.
struct MapView: UIViewRepresentable {
@Environment(.colorScheme) var colorScheme
private let mapView = GMSMapView(frame: .zero)
private let defaultZoomLevel: Float = 10
func makeUIView(context: Context) -> GMSMapView {
mapView.delegate = context.coordinator
applyColorSchemeToMap()
return mapView
}
func updateUIView(_ mapView: GMSMapView, context: Context) {
applyColorSchemeToMap()
}
func applyColorSchemeToMap() {
do {
if let styleURL = Bundle.main.url(forResource: colorScheme == .dark ? "nightmapstyle" : "map_style", withExtension: "json") {
mapView.mapStyle = try GMSMapStyle(contentsOfFileURL: styleURL)
} else {
NSLog("No se pudo encontrar style.json")
}
} catch {
NSLog("No se pudieron cargar uno o más de los estilos de mapa. (error)")
}
}
}
davy.ai
El problema puede ser causado por el hecho de que el mapStyle solo se aplica en las funciones makeUIView y updateUIView, que solo se llaman cuando la vista se carga por primera vez o se actualiza, respectivamente. Cuando se cambia el esquema de color, la función updateUIView se llama nuevamente, pero es posible que no sea suficiente para cambiar el mapStyle.
Una posible solución es agregar un observador a la propiedad colorScheme y actualizar manualmente el mapStyle cada vez que cambie. Esto se puede hacer agregando el siguiente código a la estructura MapView:
Este código agrega un observador a la propiedad colorScheme y llama a la función updateMapStyle cada vez que cambia. La función updateMapStyle luego llama a applyColorSchemeToMap para actualizar manualmente el mapStyle. Con este código agregado, el mapa ahora debería actualizar su estilo cuando se cambia el esquema de color del dispositivo.