2013-10-26 4 views
9

Ho notato un comportamento strano mentre lavoravo con MKMapView e MKMapCamera. Devo implementare alcuni comportamenti standard dell'app di Apple Maps. Fondamentalmente, ciò di cui ho bisogno è di poter passare dalla modalità 2D alla modalità 3D quando la modalità di tracciamento utente di Map View è impostata su MKUserTrackingModeFollowWithHeading.Comportamento MKMapView strano quando si imposta MKMapCamera in MKUserTrackingModeFollowWithing modalità mappa

Attualmente, la mia soluzione funziona bene quando userTrackingMode è impostato su MKUserTrackingModeNone ma lo fa animazione strano in altre modalità (accade a prescindere I setcamera: animato: SI o NO). Quando registro i parametri della telecamera poco prima e dopo aver impostato il nuovo, l'unica differenza è il mio cambiamento di intonazione.

Un altro problema sta cambiando l'altitudine della telecamera per ingrandire o ridurre a livello di programma. Sto cercando di imitare lo zoom con un gesto di apertura o chiusura nel metodo IBAction. In followWithingMode la mappa torna sempre al livello di zoom "predefinito" (altitudine della telecamera), mentre in altre modalità funziona alla grande.

ho iniziato progetto di esempio per verificare cosa sta succedendo, e che è controller di vista il mio unico dell'applicazione vista con vista mappa in cui si verifica 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 

Quello che sto cercando è un comportamento simile a Mappe Apple App. Hai qualche idea? Che cosa sto facendo di sbagliato ?

+0

a partire dal 2017, succede ancora. – Claus

risposta

5

Credo che questo sia un bug in MapKit. Ho fatto osservazioni simili con lo zoom programmatico mentre MKUserTrackingModeFollowWithHeading è abilitato: la mappa ingrandisce brevemente ma torna al livello di zoom precedente non appena riceve il successivo aggiornamento di posizione.

Vedere rdar://15374402 (MapKit: zoom programmatico durante UserTracking) e rdar://15374604 (MKUserTrackingModeFollow vieta la selezione di annotazioni sul bordo).

Il mio consiglio: evitare MKUserTrackingModeFollow e MKUserTrackingModeFollowWithHeading finché si desidera il controllo programmatico sulla regione della mappa visualizzata. aggiornamento

+1

Ho archiviato un bug report anche con Apple, è un bug piuttosto fastidioso. Ho una possibile soluzione. Ho un gestore di localizzazione singleton e utilizzo CLLocationManagerDelegate, utilizzo NSNotifications per sottoscrivere gli aggiornamenti di posizione e centrare la mappa utilizzando MKCamera ogni volta in modo che "appaia" per seguire l'utente. In questo modo puoi ancora controllare lo zoom e posizionare la mappa sull'utente. – barndog

+1

Certo, faccio una soluzione simile. Tuttavia non è esattamente lo stesso UX. Lo scorrimento non è così scorrevole (perché non possiamo regolare la durata dell'animazione), né la rotazione della mappa è manuale quando si esegue la rotazione della bussola manualmente. –

+1

Sì, è davvero frustrante. la mela ha bisogno di mettersi in gioco. – barndog

0

iOS9:

Ha lo stesso effetto: "altitudine viene ingrandito un po '"

ma questo effetto sta accadendo solo quando

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

non quando si utilizza *animated:YES*

Problemi correlati