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?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top