2013-10-26 1 views
9

Ich bemerkte seltsames Verhalten bei der Arbeit mit MKMapView und MKMapCamera. Ich muss ein Standardverhalten der Apple Maps App implementieren. Grundsätzlich muss ich in der Lage sein, zwischen 2D- und 3D-Modus zu wechseln, wenn der Benutzerverfolgungsmodus von Map View auf MKUserTrackingModeFollowWithHeading eingestellt ist.Weird MKMapView Verhalten beim Setzen von MKMapCamera in MKUserTrackingModeFollowWithHeading Map-Modus

Derzeit meine Lösung funktioniert gut, wenn userTrackingMode zu MKUserTrackingModeNone gesetzt ist, aber es tut seltsame Animation in anderen Modi (es geschieht unabhängig setCamera I: animierte: JA oder NEIN). Wenn ich Kameraparameter kurz vor und nach der Einstellung neu aufnehme, ist der einzige Unterschied meine Tonhöhenänderung.

Ein weiteres Problem ist die Kamera-Höhe zu ändern, um programmatisch zu vergrößern oder zu verkleinern. Ich versuche, Zoom mit Pinch in oder out Geste in IBAction-Methode zu imitieren. In followWithHeadingMode Karte immer auf "Standard" Zoom-Ebene (Kamera Höhe) zurück, während in anderen Modi funktioniert großartig.

begann ich Beispielprojekt zu überprüfen, was los ist, und das ist meine einzige View-Controller Ansicht Anwendung mit Kartenansicht, wo Problem auftritt:

#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 

Was ich suche ein ähnliches Verhalten wie Apple-Maps-App ist. Haben Sie irgendwelche Ideen? Was mache ich falsch ?

+0

ab 2017 passiert dies immer noch. – Claus

Antwort

5

Ich glaube, das ist ein Fehler in MapKit. Ich habe ähnliche Beobachtungen mit dem programmatischen Zoomen gemacht, während MKUserTrackingModeFollowWithHeading aktiviert ist: Die Karte wird kurz verkleinert, kehrt aber zur vorherigen Zoomstufe zurück, sobald sie die nächste Standortaktualisierung erhält.

Siehe rdar://15374402 (MapKit: programmatisches Zoomen während UserTracking) und rdar://15374604 (MKUserTrackingModeFollow verhindert Annotationsauswahl am Rand).

Mein Rat: Vermeiden Sie MKUserTrackingModeFollow und MKUserTrackingModeFollowWithHeading, solange Sie programmatische Kontrolle über die angezeigte Kartenregion haben wollen.

+1

Ich habe einen Fehlerbericht mit Apple eingereicht, es ist ein ziemlich nerviger Fehler. Ich habe eine mögliche Lösung. Ich habe einen Singleton Location Manager und benutze mit CLLocationManagerDelegate NSNotifications, um Positionsupdates zu abonnieren und die Map mit MKCamera zu zentrieren, jedes Mal wenn es so aussieht, als ob es dem Benutzer folgt. Auf diese Weise können Sie immer noch den Zoom steuern und die Karte auf dem Benutzer positionieren. – barndog

+1

Sicher mache ich eine ähnliche Problemumgehung. Trotzdem ist es nicht das gleiche UX. Das Scrollen ist nicht so flüssig (weil wir die Animationsdauer nicht anpassen können), ebenso wenig die Kartenrotation, wenn die Kompassdrehung manuell durchgeführt wird. –

+1

Ja, es ist wirklich frustrierend. Apfel muss auf sein Spiel kommen. – barndog

0

iOS9 Update:

Es hat die gleiche Wirkung: "Höhe ist ein bisschen herausgezoomt, um die"

aber dieser Effekt geschieht nur dann, wenn

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

nicht bei der Verwendung von *animated:YES*