Mit der MKMapView
Option "Aktuellen Standort des Benutzers anzeigen" wird automatisch ein Standort des Benutzers auf dem angezeigt map
.
Ich möchte diesen Ort verschieben und zoomen, wenn er gefunden wird (und wenn er sich ändert).
Das Problem ist, dass es anscheinend keine Methode gibt, die aufgerufen wird, wenn der Benutzerstandort auf dem aktualisiert map
wird zoom/scroll
. Daher kann ich den entsprechenden Code nirgends einfügen .
Gibt es eine Möglichkeit, benachrichtigt zu werden, wenn ein MKMapView
Benutzer den Standort des Benutzers erhalten (oder aktualisiert) hat, damit ich ihn verschieben / zoomen kann? Wenn ich meine eigenen verwende, entsprechen CLLocationManager
die Aktualisierungen, die ich erhalte, nicht den Aktualisierungen der Benutzermarkierung auf der Karte. Daher sieht es albern aus, wenn sich meine Karte Sekunden vor dem Erscheinen des blauen Stifts bewegt und zoomt.
Das fühlt sich wie eine grundlegende Funktionalität an, aber ich habe Wochen damit verbracht, nach einer Lösung zu suchen und nichts in der Nähe gefunden.
Antworten:
Sie müssen sich für KVO-Benachrichtigungen über das
userLocation.location
Eigentum von registrierenMKMapView
.viewDidLoad:
Fügen Sie dazu diesen Code in Ihren ViewController oder an eine beliebige Stelle an der Stelle ein, an der Ihre Kartenansicht initialisiert wird.[self.mapView.userLocation addObserver:self forKeyPath:@"location" options:(NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld) context:NULL];
Implementieren Sie dann diese Methode, um KVO-Benachrichtigungen zu erhalten
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { if ([self.mapView showsUserLocation]) { [self moveOrZoomOrAnythingElse]; // and of course you can use here old and new location values } }
Dieser Code funktioniert gut für mich.
BTW,
self
ist mein Viewcontroller in diesem Zusammenhang.quelle
Dies ist eine Kombination aus ddnv und Dustins Antwort, die für mich funktioniert hat:
mapView ist der Name des MKMapView * mapView;
Beachten Sie beim Hinzufügen dieser Zeile in viewDidLoad, dass möglicherweise mehr Zeilen in der Last enthalten sind. Dies ist nur vereinfacht.
- (void) viewDidLoad { [self.mapView.userLocation addObserver:self forKeyPath:@"location" options:(NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld) context:nil]; }
Erstellen Sie dann die tatsächliche Auflistungsmethode, mit der die Karte an den aktuellen Speicherort verschoben wird:
// Listen to change in the userLocation -(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { MKCoordinateRegion region; region.center = self.mapView.userLocation.coordinate; MKCoordinateSpan span; span.latitudeDelta = 1; // Change these values to change the zoom span.longitudeDelta = 1; region.span = span; [self.mapView setRegion:region animated:YES]; }
Vergessen Sie nicht, die Zuordnung ordnungsgemäß aufzuheben und die Registrierung des Beobachters aufzuheben:
- (void)dealloc { [self.mapView.userLocation removeObserver:self forKeyPath:@"location"]; [self.mapView removeFromSuperview]; // release crashes app self.mapView = nil; [super dealloc]; }
quelle
Seit iOS 5.0 hat Apple MKMapView um eine neue Methode erweitert. Diese Methode macht genau das, was Sie wollen und mehr.
Schauen Sie sich Folgendes an: https://developer.apple.com/documentation/mapkit/mkmapview
- (void)setUserTrackingMode:(MKUserTrackingMode)mode animated:(BOOL)animated;
quelle
[self.mapView setUserTrackingMode:MKUserTrackingModeFollow animated:YES];
Sie können überwachen, wann der
MKMapView
Benutzerstandort auf der Karte aktualisiert wird, indem Sie dasMKMapViewDelegate
Protokoll implementieren . Einfach umsetzen:- (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation { CLLocationAccuracy accuracy = userLocation.location.horizontalAccuracy; if (accuracy ......) { } }
Dieser Rückruf sollte perfekt mit dem übereinstimmen, was auf der Karte angezeigt wird.
quelle
Versuche dies:
[mapView setUserTrackingMode:MKUserTrackingModeFollow animated:YES];
quelle
Kein Problem ... Fügen Sie in der viewDidLoad-Methode Ihrer UIViewController-Unterklasse, in der MKMapView vorhanden ist, Folgendes hinzu (vorausgesetzt, Ihre MKMapView heißt map):
CLLocation *location = [[[CLLocation alloc] initWithLatitude:map.centerCoordinate.latitude longitude:map.centerCoordinate.longitude] autorelease]; //Get your location and create a CLLocation MKCoordinateRegion region; //create a region. No this is not a pointer region.center = location.coordinate; // set the region center to your current location MKCoordinateSpan span; // create a range of your view span.latitudeDelta = BASE_RADIUS / 3; // span dimensions. I have BASE_RADIUS defined as 0.0144927536 which is equivalent to 1 mile span.longitudeDelta = BASE_RADIUS / 3; // span dimensions region.span = span; // Set the region's span to the new span. [map setRegion:region animated:YES]; // to set the map to the newly created region
quelle