¿Cómo se especifica el nivel de zoom cuando se utiliza un MKUserTrackingBarButtonItem?

Estoy usando un button MKUserTrackingBarButtonItem para permitir al usuario rastrear automáticamente su location en un map. El problema es que cuando tocan este button, se aleja demasiado. Quiero que comience en un nivel de zoom especificado (es decir, span). ¿Cómo puedo conseguir esto?

Cuando el usuario toca el button para cambiar a MKUserTrackingModeFollow , parece que usa el mismo nivel de zoom que el último usuario cambió manualmente (es decir, usando gestos en el map). Intentar especificar un nivel de zoom diferente a través de setRegion o setVisibleMapRect no afecta el nivel de zoom que se utilizará cuando el modo se cambia a MKUserTrackingModeFollow .

Intentando override mapView:didChangeUserTrackingMode: para establecer la región, el modo se cambia de nuevo a MKUserTrackingModeNone . Ejemplo:

 - (void)mapView:(MKMapView *)mapView didChangeUserTrackingMode:(MKUserTrackingMode)mode animated:(BOOL)animated { if (mode == MKUserTrackingModeFollow) { CLLocationCoordinate2D center = mapView.userLocation.location.coordinate; MKCoordinateSpan span = MKCoordinateSpanMake(0.002306, 0.001717); [mapView setRegion:MKCoordinateRegionMake(center, span) animated:YES]; // [mapView setUserTrackingMode:MKUserTrackingModeFollow animated:NO]; } } 

Si bash restablecer el modo inmediatamente después de configurar la región, funciona bien si el usuario está parado, pero networkinguce el zoom si el usuario se está moviendo.

La solución más simple sería si hubiera una manera de simplemente especificar algo como un nivel de zoom para MKUserTraking enviándolo mi valor de span. Sin embargo, dado que no parece existir, ¿qué más puedo hacer?

Tuve el mismo problema y utilicé un enfoque diferente para solucionarlo. Puede usar la function MapCamera para esto en lugar de ese button.

En cada nueva location, haga esto:

  MKMapCamera *newCamera = [MKMapCamera cameraLookingAtCenterCoordinate:[newLocation coordinate] fromEyeCoordinate:[oldLocation coordinate] eyeAltitude:2000]; [mapView setCamera:newCamera animated:TRUE]; 

Y juega con la altitud de los ojos.

Si el usuario amplía o aleja manualmente, puede leer el valor de altitud de mapview.camera.altitude y tampoco actualizar la camera cuando el usuario usa manualmente el map.

Según la documentation de Apple utilizada aquí

https://developer.apple.com/reference/mapkit/mkmapview/1616208-usertrackingmode

Configurar el modo de seguimiento para seguir o seguir con el encabezado hace que la vista del map centre el map en esa location y comience a rastrear la location del usuario. Si el map se networkinguce, la vista de map amplía automáticamente la location del usuario, cambiando efectivamente la región visible actual.

Aquí cambiar la región no afecta a su región visible por ese motivo.

 - (void)mapView:(MKMapView *)mapView didChangeUserTrackingMode:(MKUserTrackingMode)mode animated:(BOOL)animated { if (mode == MKUserTrackingModeFollow) { CLLocationCoordinate2D center = mapView.userLocation.location.coordinate; MKCoordinateSpan span = MKCoordinateSpanMake(0.002306, 0.001717); [mapView setRegion:MKCoordinateRegionMake(center, span) animated:YES]; // [mapView setUserTrackingMode:MKUserTrackingModeFollow animated:NO]; } } 

Entonces, solo necesita cambiar la coorderada central en didChangeUserTrackingMode lugar de cambiar toda la región

 - (void)mapView:(MKMapView *)mapView didChangeUserTrackingMode:(MKUserTrackingMode)mode animated:(BOOL)animated { if (mode == MKUserTrackingModeFollow) { [self.mapView setCenterCoordinate:mapView.userLocation.location.coordinate animated:YES]; } } - (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation { [self.mapView setCenterCoordinate:mapViewuserLocation.location.coordinate animated:YES]; } 

Al hacer clic en MKUserTrackingBarButtonItem, cambie el nivel de zoom.

  CLLocationCoordinate2D center = mapView.userLocation.location.coordinate; MKCoordinateSpan span = MKCoordinateSpanMake(0.002306, 0.001717); [mapView setRegion:MKCoordinateRegionMake(center, span) animated:YES];