2014-04-21 12 views
16

Sto utilizzando un pulsante MKUserTrackingBarButtonItem per consentire all'utente di tracciare automaticamente la propria posizione su una mappa. Il problema è che quando toccano questo pulsante, viene ingrandito troppo. Voglio che inizi a un livello di zoom specificato (es. Span). Come posso raggiungere questo obiettivo?Come specificare il livello di zoom quando si utilizza un oggetto MKUserTrackingBarButtonItem?

Quando l'utente tocca il pulsante per passare a MKUserTrackingModeFollow, sembra che utilizzi lo stesso livello di zoom a cui l'utente ha modificato l'ultima volta manualmente (ad esempio utilizzando i gesti sulla mappa). Il tentativo di specificare un diverso livello di zoom tramite setRegion o setVisibleMapRect non influisce sul livello di zoom che verrà utilizzato quando si passa alla modalità MKUserTrackingModeFollow.

Tentando di override mapView:didChangeUserTrackingMode: per impostare la regione, la modalità viene modificata in MKUserTrackingModeNone. Esempio:

- (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]; 
    } 
} 

Se tento di ripristinare la modalità subito dopo l'impostazione della regione, funziona bene se l'utente è fermo, ma lo zoom indietro se l'utente è in movimento.

La soluzione più semplice sarebbe se ci fosse un modo per specificare semplicemente qualcosa come un livello di zoom per MKUserTraking inviandogli il mio valore di span. Tuttavia, dal momento che non sembra esistere, che altro posso fare?

+0

Avete trovato una soluzione per Questo? Al momento sto sbattendo la testa contro lo stesso problema. –

risposta

7

Ho avuto lo stesso problema e ho utilizzato un approccio diverso per risolverlo. È possibile utilizzare la funzione MapCamera per questo al posto di quel pulsante.

Su ogni nuova posizione fare questo:

MKMapCamera *newCamera = [MKMapCamera cameraLookingAtCenterCoordinate:[newLocation coordinate] 
fromEyeCoordinate:[oldLocation coordinate] 
eyeAltitude:2000]; 

[mapView setCamera:newCamera animated:TRUE]; 

e giocare con l'eyeAltitude.

Se l'utente esegue manualmente lo zoom avanti o indietro è possibile leggere il valore dell'altitudine da mapview.camera.altitude, inoltre, non aggiornare la fotocamera quando l'utente utilizza manualmente la mappa.

+0

sembra che questo sia l'unico modo! – Rassam

0

Secondo la documentazione Apple ha utilizzato qui

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

L'impostazione della modalità di tracking per seguire o seguire con la rubrica provoca la visualizzazione della mappa per centrare la mappa su quella posizione e iniziare a monitorare l'utente del Posizione. Se la mappa viene rimpicciolita, la vista della mappa ingrandisce automaticamente la posizione dell'utente, cambiando efficacemente la regione visibile corrente.

Qui la modifica della regione non influisce sulla regione visibile a causa di questo 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]; 
} 
} 

quindi basta cambiare coordinare centro sulla didChangeUserTrackingMode invece di cambiare tutta la regione

- (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 clic del MKUserTrackingBarButtonItem cambiare il livello di zoom

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