Wie MKMapView mit einem bestimmten Benutzer zu initialisieren?
-
08-07-2019 - |
Frage
Meine App kennt die aktuelle Position des Benutzers (CoreLocation.framework). Sobald der Benutzer einen neuen MapView sein iPhone öffnet beginnt erneut für die aktuelle Position zu suchen. Ist es möglich, dass zu überspringen oder die erste Benutzerposition für MKMapView zu ändern?
Edit:
Ist es möglich, MKMapView und verwenden Sie einen anderen Locationmanager überschrieben werden?
Lösung
Ja, ist es möglich, ein separates Standort-Manager-Objekt zu haben und seinen Wertes auf den mapview zuweisen (BTW, ich bin mit ‚=‘ unten als Liste Präfix die SO-Code-Formatierer von Borking zu verhindern).
= In Ihrem UIViewController
pflegen zwei separate Eigenschaften: ein zu einem MKMapView
und man zu einem CLLocationManager
.
= Erstellen Sie eine XIB-Datei mit dem MKMapView
und einem anderen Fenster Chrom Sie wollen. Verbinden die Auslässe an den Controller propeties. Stellen Sie sicher, MKMapView
keine Benutzer Lage folgen.
= Hat die UIViewController das CLLocationManagerDelegate
Protokoll implementieren - vor allem die locationManager:didUpdateToLocation:fromLocation:
Methode, die aufgerufen wird, sobald ein neuer Positionswert zur Verfügung steht. Wir werden den Controller als Delegierter für den Standort-Manager werden zu setzen.
= In dem loadView
Methode des Viewcontroller, laden Sie die NIB mit dem MKMapView
drin. Benutzer-Feedback geben Sie ihm einen UIActivityIndicatorView
Spinner setzen und auf startAnimating
möchten. Dann mit Ihnen starten:
self.locationManager = [[CLLocationManager alloc] init];
self.locationManager.delegate = self;
self.locationManager.desiredAccuracy = kCLLocationAccuracyKilometer;
self.locationManager.distanceFilter = 10; // or whatever
[self.locationManager startUpdatingLocation];
= In locationManager:didUpdateToLocation:fromLocation:
geprüft, ob das Ereignis seit den letzten N Sekunden aktualisiert wurde. Dann den Standort-Manager sagen Aktualisierung zu stoppen, der Spinner Animieren zu stoppen, und die lat / long-Daten zu erhalten und sie in die Kartenansicht zuweisen zusammen mit einem Blick Spannweite und der Region, so dass es zoomt und zentriert an der richtigen Adresse.
= Jetzt ist hier der schwierige Teil: der blaue Marmor ‚throbber‘ ist ein Merkmal der Benutzerposition mapview Tracking. Sie werden für einen Moment haben zu ‚fälschen‘, bis die wirkliche tritt in (oder nur über einen separaten Marker für den aktuellen Standort verwenden und halten ihre Position selbst). Persönlich würde ich mit dem blauen Marmor gehen, die der Benutzer kennt.
= machen, so zeigt es direkt beim Start benötigen Sie eine benutzerdefinierte MKAnnotationView nur mit der blauen Marmor Grafik an dem durch die Standortmanager zurück Standort hinzugefügt erstellen. Das bedeutet, eine Momentaufnahme einer Mapview mit der Lage zeigt, nimmt, dann aus nur den blauen Marmor photoshopping und als das Bild für eine benutzerdefinierte Anmerkung Ansicht verwendet wird.
= Wenn Sie es möchten die Karte aktiv folgen, können Sie die userlocation Nachführung des mapview ermöglichen und, wenn es die eigentlichen Daten bekommt, Sie verstecken die vorher gehörte Markierung und lassen Sie die mapview die Aktualisierung tun. Die andere Option ist der bestehende Standort-Manager zu ermöglichen Updates die Position des blauen Marmors selbst Annotation jede Sekunde oder so und aktualisiert, um weiterhin zu empfangen.
= Um die mapview eigene userLocation lassen Sie die Aktualisierung zu viewDidLoad hinzufügen:
[self.map.userLocation addObserver:self
forKeyPath:@"location"
options:(NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld)
context:NULL];
self.map.showsUserLocation = YES; // starts updating user location
= Implementieren observeValueForKeyPath
. Es wird aufgerufen, wenn das location
Attribut des mapview des userlocation
einen Wert hat:
-(void)observeValueForKeyPath:(NSString *)keyPath
ofObject:(id)object
change:(NSDictionary *)change
context:(void *)context
{
if ([self.map isUserLocationVisible]) {
[self.locationManager stopUpdatingLocation];
self.ownBlueMarble.hidden = YES;
}
// The current location is in self.map.userLocation.coordinate
}
= die Aufwärm Verzögerung zu vermeiden, in der aktuellen Lage zeigt, halten einen Verweis auf die Viewcontroller die Karte enthält, und den Standort-Manager, so dass es nicht weggeht (es ist ein bisschen wie ein Speicher Schwein, aber wenn Sie loslassen Sie ‚ll müssen wieder warten, bis MapView die Fliesen geladen und ist bereit zu gehen).
= In viewWillLoad
können Sie die letzte bekannte Position in der benutzerdefinierten Bluemarble Anmerkung stopfen und es zeigen. Ein- / ausschalten userLocation Tracking und wenn Sie die Meldung des gleiche hide-the-Annotation-show-the-real-Marmor Trick wird die Arbeit. Die mapview eigenen Standort Manager Tritte in und wenn er die Daten hat, können Sie Ihre Anmerkung Markierung verschwinden.
= Sie möchten vielleicht die viewWillDisappear
Methode des Viewcontroller implementieren und manuell userLocation
Tracking auf der mapview auszuschalten, so dass es ab der nächsten Zeit standardmäßig ist der Ansicht gebracht werden. Sie wollen auch den letzten bekannten userLocation
erhalten und es für die nächste speichern get-go. Auf diese Weise können Sie alle Positionsmarker-Jonglieren im viewWillAppear
Methode tun und müssen sich keine Sorgen über userLocation zu stören, bis Sie bereit sind.
GutGlück.
Andere Tipps
In Ihrem Controller:
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
CLLocationCoordinate2D coord = {latitude: 37.423617, longitude: -122.220154};
MKCoordinateSpan span = {latitudeDelta: 1, longitudeDelta: 1};
MKCoordinateRegion region = {coord, span};
[mapView setRegion:region];
}
Wenn Karte erscheint es geht der Nähe von Palo Alto zentriert werden
Versuchen Sie, die showUserLocation
Eigenschaft auf false bei der Initialisierung Einstellung und dann zur Wiederherstellung des region
der Kartenansicht zuvor hatte (Sie werden natürlich diese speichern, bevor die vorherige Karte zerstört wird).
Ist das, was Sie wollten?
Sie brauchen nicht einen anderen Standort-Manager zu verwenden, können Sie hinzufügen, was Punkte, die Sie auf der Karte wollen und aktualisieren, um sie über alles, was andere Logik, die Sie wollen.
Angenommen, Sie haben eine Socket-Verbindung zu einer Fernbedienung Auto hatten, und dass Autoeinfaßung Daten Geo-Standort zurückschicken Informationen in der Nutzlast enthält. Sie können die aus, analysieren und die Position der Miniaturansicht auf Ihrer Karte in Echtzeit aktualisieren. Die „userLocation“ Eigenschaft ist nicht für die benötigte, aber man konnte es zeigen, wenn man will.
Die Position des Benutzers schreibgeschützt ist, können Sie es verwenden oder nicht. Das bedeutet nicht, dass Sie einen anderen Standort-Manager müssen etwas tun, was Sie tun können müssen. Es klingt wie Sie Ihre App nicht wirklich diese Funktion benötigen, aber ich konnte Ihre Frage wurde Mißverständnis.