Cómo mantener MKMapView en iOS 6 orientado al Norte siempre que cambie de modo desde MKUserTrackingModeFollowWithHeading

Estoy cambiando entre los tres modos de orientación de map diferentes utilizando MKUserTrackingModeNone , MKUserTrackingModeFollow , MKUserTrackingModeFollowWithHeading y esto funciona.

Sin embargo, tengo un problema con la orientación del map que no se restablece a la orientación orientada al norte (al norte del map en la parte superior de la pantalla) al cambiar de MKUserTrackingModeFollowWithHeading a MKUserTrackingModeNone .

En la aplicación de maps integrada en iphone/ipad , el flujo es así:

Cuando inicia la aplicación, está en modo MKUserTrackingModeNone y está orientada al norte. Cuando alterna el modo de orientación, cambia a MKUserTrackingModeFollow y la orientación sigue en el norte.

Cuando cambia de nuevo, cambia a MKUserTrackingModeFollowWithHeading , y el map gira de acuerdo con la dirección hacia la que apunta / señala el iPhone.

Cuando cambia la orientación nuevamente, vuelve a MKUserTrackingModeNone , y el map vuelve a orientarse hacia el norte.

Me gustaría que mi aplicación se comporte de la misma manera en lo que respecta a la orientación cuando se cambia de modo, pero cuando hago como en el paso 4 anterior y cambio de MKUserTrackingModeFollowWithHeading a MKUserTrackingModeNone , la orientación se mantiene justo antes de hacer el cambio de orientación en lugar de girar De vuelta a la orientación norte.

Estoy haciendo el cambio de orientación con el control estándar MKUserTrackingBarButtonItem ubicado en una barra de herramientas.

¿Alguien me ayude a solucionar este problema?

También me estoy topando con este problema en un iPhone 5 con iOS 6.1.4. Utilicé esta solución rápida simple pero fea para obligar a la vista del map a girar hacia arriba hacia el norte:

 -(void)someMethod { // Currently in MKUserTrackingModeFollowWithHeading mode // Set tracking mode back to MKUserTrackingModeFollow [_mapView setUserTrackingMode:MKUserTrackingModeFollow]; // After a short delay, set mode to MKUserTrackingModeNone [self performSelector:@selector(mapViewTrackingModeNone) withObject:nil afterDelay:0.2]; } - (void)mapViewTrackingModeNone { [_mapView setUserTrackingMode:MKUserTrackingModeNone]; // Bang! The map rotates back to North-Up } 

Probablemente haya una manera mucho mejor de hacer esto, pero aún no lo he encontrado.

En iOS 5, cambiará hacia el norte por ti, pero en iOS 6 no. Puede presentar una request de mejora en bugreport.apple.com.

Podría implementar la function de callback de delegado y aplicar una rotation en la callback de delegado …

 - (void)mapView:(MKMapView *)mapView didChangeUserTrackingMode:(MKUserTrackingMode)mode animated:(BOOL)animated { if (mode == MKUserTrackingModeNone) [self rotateTheMapView]; } - (void)rotateTheMapView { // See https://stackoverflow.com/q/1245461/1445366 } 

(Vea Rotate MapView usando la orientación de Brújula para instrucciones y código de rotation).

El problema es que Apple no expone la rotation actual exacta con su lógica interna, por lo que cualquier cálculo del encabezado actual proporcionado por iOS puede estar un poco apagado, lo que hace que su map esté un poco alejado del norte cuando termine.

Debe juntar una pequeña aplicación de testing, que solo tenga una vista de map y un MKUserTrackingBarButtonItem y unir ambas. Si debería hacer lo que describió y no requiere una sola línea de código. Todas las conexiones se pueden hacer en IB. Una vez que vea que funciona, puede volver a su código y repetir el process.