2010-03-14 10 views
10

Sto usando MapKit per visualizzare la posizione dell'utente rispetto ai pin che li circondano. Mi piacerebbe essere in grado di simulare la funzionalità fornita da Maps tramite il pulsante mirino nell'angolo in basso a sinistra dello schermo. Sono già consapevole che MapKit fornisce un oggetto CLLocation con la posizione dell'utente tramite MKUserLocation, volevo solo chiedere consiglio su come dovrei concentrarmi su quella posizione. La mia inclinazione iniziale era quella di usare un NSTimer per centrare la mappa su quella coordinata ogni 500ms circa.Come seguire la posizione dell'utente con MapKit

C'è un modo migliore per farlo? C'è qualcosa di integrato in MapKit che mi manca che realizzerà questo?

Grazie mille, Brendan

risposta

7

penso che mi sarebbe effettivamente utilizzare il CoreLocation CLLocationManager e usare il suo metodo delegato locationManager:didUpdateToLocation:fromLocation:.

In questo modo, non si ha il sovraccarico di un NSTimer e si aggiorna solo quando è disponibile una nuova posizione.

È possibile estrarre la longitudine e la latitudine dall'oggetto CLLocation inviato al metodo locationManager:didUpdateToLocation:fromLocation: e passarlo alla visualizzazione mappa.

+0

Non sarebbe più inutile alla fine, visto che MapKit sta già utilizzando il GPS? Penserei che il GPS userebbe più energia di un timer. Detto questo, ho ottime possibilità di sbagliarmi. Ho solo programmato su iPhone per 1 settimana. – bloudermilk

+0

Quindi stai dicendo che la Core Location ** non usa il GPS? –

+0

Sto dicendo che CL * fa * usa il GPS. Quindi, se due classi eseguivano il ping del ricevitore GPS (il CLLocationManager interno di MapKit per il pin blu di posizione dell'utente e il CLLocationManager proposto), potrebbero essere utilizzate con molta più energia rispetto a un MapKit CLLocationManager interno e un semplice NSTimer. Suppongo che questo dipenda dal fatto che l'SDK dell'iPhone sia abbastanza intelligente da supportare più CLLocationManager senza collegarli direttamente al GPS. O forse il delegato MapKit fornisce la propria didUpdateToLocation :? – bloudermilk

0

Vado con la risposta di Jacob Relkin. Il tutorial This fornisce una procedura dettagliata sull'utilizzo di CoreLocation in un'app per iPhone. Spero che questo ti aiuti.

Tutto il meglio.

+0

@Warrior, grazie :) –

12

È molto semplice fare in modo che la mappa aggiorni automaticamente la posizione dell'utente proprio come nelle mappe di google. Basta impostare showsUserLocation su YES

self.mapView.showsUserLocation = YES 

... e quindi implementare il MKMapViewDelegate per centrare nuovamente la mappa quando la posizione viene aggiornata.

-(void)    mapView:(MKMapView *)mapView 
     didUpdateUserLocation:(MKUserLocation *)userLocation 
{ 
    if(isTracking) 
    { 
     pendingRegionChange = YES; 
     [self.mapView setCenterCoordinate: userLocation.location.coordinate 
           animated: YES]; 
    } 
} 

E per consentire all'utente di ingrandire & padella senza rubare la vista di nuovo alla posizione corrente ...

-(void) mapView:(MKMapView *)mapView regionWillChangeAnimated:(BOOL)animated 
{ 
    if(isTracking && ! pendingRegionChange) 
    { 
     isTracking = NO; 
     [trackingButton setImage: [UIImage imageNamed: @"Location.png"] 
         forState: UIControlStateNormal]; 
    } 

    pendingRegionChange = NO; 
} 

-(IBAction) trackingPressed 
{ 
    pendingRegionChange = YES; 
    isTracking = YES; 
    [mapView setCenterCoordinate: mapView.userLocation.coordinate 
         animated: YES]; 

    [trackingButton setImage: [UIImage imageNamed: @"Location-Tracking.png"] 
        forState: UIControlStateNormal]; 
} 
+0

È meglio usare il centro di MKMApView con la seguente posizione utente rispetto a CoreLocation? Ho avuto una classe LocationUpdater che restituisce una nuova CLLocation quando si aggiorna. MKMapView si aggiorna con la stessa frequenza? – quantumpotato

39

Se siete su IOS5 + Questo è molto facile. Basta cambiare il "userTrackingMode" utilizzando il codice come ad esempio:

[_mapView setUserTrackingMode:MKUserTrackingModeFollow animated:YES]; 

Ciò agevolmente seguire gli utenti posizione corrente. Se trascini la mappa, anche la modalità di tracciamento verrà impostata su MKUserTrackingModeNone, che di solito è il comportamento che desideri.

+7

Un'altra prova degli ovvi limiti del concetto di risposta accettata. Questa è la risposta che dovrebbe essere al top! La risposta di Jacob è stata grande quattro anni fa, ma ora completamente obsoleta, eppure rimarrà per sempre esposta come prima risposta. – KPM

Problemi correlati