2010-03-14 10 views
10

Ich verwende MapKit, um den Standort des Benutzers relativ zu den Pins um ihn herum anzuzeigen. Ich möchte die Funktionalität, die Maps bietet, über die Fadenkreuzschaltfläche in der unteren linken Ecke des Bildschirms nachahmen. Mir ist bereits bekannt, dass MapKit über MKUserLocation ein CLLocation-Objekt mit dem Standort des Benutzers bereitstellt. Ich wollte nur Rat suchen, wie ich mich auf diesen Ort konzentrieren sollte. Meine anfängliche Neigung war, einen NSTimer zu verwenden, um die Karte auf dieser Koordinate alle 500 ms oder so zu zentrieren.So verfolgen Sie die Benutzerposition mit MapKit

Gibt es einen besseren Weg, dies zu tun? Ist in MapKit etwas eingebaut, dass ich vermisse, dass dies erreicht wird?

Vielen Dank, Brendan

Antwort

7

Ich denke, dass ich tatsächlich die Corelocation CLLocationManager und seine Delegatmethode locationManager:didUpdateToLocation:fromLocation: verwenden verwenden würde.

Auf diese Weise haben Sie nicht den Overhead einer NSTimer, und es wird nur aktualisiert, wenn ein neuer Standort verfügbar ist.

Sie können den Längen- und Breitengrad vom CLLocation Objekt, das an die locationManager:didUpdateToLocation:fromLocation:-Methode gesendet wird, ziehen und an die Kartenansicht übergeben.

+0

Wäre das am Ende doch weniger interessant, da MapKit das GPS ohnehin schon nutzt? Ich würde denken, dass GPS mehr Energie verbrauchen würde als ein Timer. Davon abgesehen gibt es wirklich gute Chancen, dass ich falsch liege. Ich habe nur für 1 Woche auf dem iPhone programmiert. – bloudermilk

+0

Sie sagen also, der Core Location ** verwendet nicht GPS? –

+0

Ich sage CL * verwendet * GPS. Wenn also zwei Klassen den GPS-Empfänger anpingen (MapKits interner CLLocationManager für den blauen Benutzerstandort-Pin und Ihren vorgeschlagenen CLLocationManager), könnte er viel mehr Energie verbrauchen als der eine interne MapKit CLLocationManager und ein einfacher NSTimer. Ich nehme an, dass es darauf ankommt, ob das iPhone SDK intelligent genug ist, um mehrere CLLocationManager zu unterstützen, ohne jedes einzelne mit dem GPS zu verbinden. Oder vielleicht bietet der MapKit-Delegate seine eigene didUpdateToLocation :? – bloudermilk

0

Ich gehe mit Jacob Relkins Antwort. This Tutorial bietet eine Schritt-für-Schritt-Anleitung zur Verwendung von CoreLocation in einer iPhone App. Hoffe das hilft dir.

Alles Gute.

+0

@Warrior, thanks :) –

12

Es ist wirklich einfach, die Karte den Benutzerstandort automatisch genau wie die Google Maps zu aktualisieren. Setzen Sie einfach showsUserLocation auf YES

self.mapView.showsUserLocation = YES 

... und dann die MKMapViewDelegate implementieren die Karte neu zu zentrieren, wenn der Standort aktualisiert wird.

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

und dem Benutzer zu ermöglichen & Pfanne zu vergrößern, ohne den Blick zurück auf die aktuelle Lage zu stehlen ...

-(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

Ist es besser, das MKMApView-Center mit dem folgenden Benutzerstandort als CoreLocation zu verwenden? Ich hatte eine LocationUpdater-Klasse, die bei der Aktualisierung einen neuen CLLocation zurückgibt. Wird MKMapView mit der gleichen Häufigkeit aktualisiert? – quantumpotato

39

Wenn Sie auf IOS5 sind + Dies ist sehr einfach. Ändern Sie einfach den "userTrackingMode" mit einem Code wie:

Dies wird reibungslos dem aktuellen Standort des Benutzers folgen. Wenn Sie die Karte ziehen, wird der Tracking-Modus sogar auf MKUserTrackingModeNone zurückgesetzt, was normalerweise das gewünschte Verhalten ist.

+7

Ein weiterer Beweis für die offensichtlichen Einschränkungen des Konzepts der akzeptierten Antwort. Dies ist die Antwort, die an der Spitze sein sollte! Jacobs Antwort war vor vier Jahren großartig, aber jetzt völlig veraltet, wird aber für immer als erste Antwort angezeigt werden. – KPM

Verwandte Themen