Comportamiento extraño de MKMapView al configurar MKMapCamera en MKUserTrackingModeFollowWithHeading mode map

Noté un comportamiento extraño mientras trabajaba con MKMapView y MKMapCamera. Necesito implementar algo del comportamiento estándar de la aplicación Apple Maps. Básicamente, lo que necesito es poder cambiar entre el modo 2D y 3D cuando el modo de seguimiento de usuarios de Map View está configurado en MKUserTrackingModeFollowWithHeading .

Actualmente, mi solución funciona bien cuando userTrackingMode está configurado en MKUserTrackingModeNone pero hace una animation extraña en otros modos (sucede independientemente de que establezca Camera: animated: YES o NO). Cuando logging los parameters de la camera justo antes y después de configurar nuevo, la única diferencia es mi cambio en el tono.

Otro problema es cambiar la altitud de la camera para acercar o alejar programáticamente. Estoy tratando de imitar el zoom con un pellizco dentro o fuera del gesto en el método IBAction. En followWithHeadingMode map siempre vuelve al nivel de zoom "pnetworkingeterminado" (altitud de la camera), mientras que en otros modos funciona de maravilla.

Comencé un proyecto de ejemplo para verificar lo que está sucediendo, y ese es el controller de vista de mi aplicación de vista única con vista de map donde ocurre el problema:

#import "CCViewController.h" @interface CCViewController () @end @implementation CCViewController - (void)viewDidLoad{ [super viewDidLoad]; } - (void)setUpMap{ [self.mapView setShowsUserLocation: YES]; } - (void)viewDidAppear:(BOOL)animated{ [self setUpMap]; } - (IBAction)mapModeSwitchClicked:(id)sender { MKMapCamera *newCamera = [MKMapCamera camera]; newCamera.centerCoordinate = self.mapView.camera.centerCoordinate; newCamera.heading = self.mapView.camera.heading; newCamera.altitude = self.mapView.camera.altitude; if(!self.mapView.camera.pitch){ newCamera.pitch = 50; self.mapModeSwitch.title = @"2D"; } else{ newCamera.pitch = 0; self.mapModeSwitch.title = @"3D"; } [self.mapView setCamera:newCamera animated:YES]; } - (IBAction)locateMeButtonClicked:(id)sender { if(self.mapView.userTrackingMode != MKUserTrackingModeFollowWithHeading) [self.mapView setUserTrackingMode:MKUserTrackingModeFollowWithHeading animated:YES]; else [self.mapView setUserTrackingMode:MKUserTrackingModeNone animated:YES]; } - (void)zoomMapWithZoomFactor:(double)factor{ MKMapCamera *newCamera = [MKMapCamera camera]; newCamera.pitch = self.mapView.camera.pitch; newCamera.heading = self.mapView.camera.heading; newCamera.altitude = self.mapView.camera.altitude * factor; newCamera.centerCoordinate = self.mapView.camera.centerCoordinate; [self.mapView setCamera:newCamera animated:YES]; } - (IBAction)zoomInClicked:(id)sender { [self zoomMapWithZoomFactor: 0.5]; } - (IBAction)zoomOutClicked:(id)sender { [self zoomMapWithZoomFactor: 2]; } @end 

Lo que estoy buscando es un comportamiento similar a la aplicación Apple Maps. ¿Tienes alguna idea? Qué estoy haciendo mal ?

Creo que este es un error en MapKit. Hice observaciones similares con el zoom programático mientras MKUserTrackingModeFollowWithHeading está habilitado: el map se aleja en breve, pero regresa al nivel de zoom anterior tan pronto como recibe la siguiente actualización de location.

Consulte rdar: // 15374402 (MapKit: zoom programático durante UserTracking) y rdar: // 15374604 (MKUserTrackingModeFollow prohíbe la selección de anotación en el borde).

Mi consejo: evite MKUserTrackingModeFollow y MKUserTrackingModeFollowWithHeading mientras desee un control programático sobre la región del map que se muestra.

Actualización de iOS9 :

Tiene el mismo efecto: "la altitud se networkinguce un poco"

pero este efecto está sucediendo solo cuando

 [self.mapView setCamera:newCamera animated:NO]; 

no al usar *animated:YES*