2013-12-22 6 views
5

Ich implementiere eine Kartenfunktion in meiner App, in der ich dem Benutzer erlaube, seine aktuelle Position durch Verschieben festzulegen.Verfolgung von MKMapView centerCoordinate beim Schwenken

Die ganze Zeit möchte ich eine MKAnnotation in der centerCoordinate haben. Also, was ich tun will, ist zu verfolgen, wenn die CenterCoordinate der Karte ändert und die Koordinaten der Annotation korrekt ändern. Das Verhalten wäre ähnlich dem von Uber, Hailo und anderen.

Ich versuchte eine zeitbasierte Implementierung, wo jeder 0.00001s der centerCoordinate würde überprüft werden und die Anmerkung würde auch verschoben werden. Wenn die Karte jedoch nicht sanft bewegt wird, springt die Anmerkung von einem Ort zum anderen, was nicht zu einer guten Benutzeroberfläche führt.

Eine andere Implementierung, die ich versuchte, ist über Gestenerkenner und die Delegiertenmethoden von MKMapView (regionDidChange/regionWillChange). Dies führt wiederum zu einem sehr abrupten Übergang.

Kann mir bitte jemand empfehlen, wie man das besser macht?

Antwort

24

Ich schlage vor, keine tatsächliche id<MKAnnotation> überhaupt (zumindest für diese "aktuelle Standorteinstellung" -Modus) zu verwenden.

Statt:

  1. hinzufügen Ansicht (zB UIImageView.), Um ein Bild eines Stiftes (oder was auch immer Symbol, das Sie mögen) in Front der Kartenansicht enthält.
  2. Diese Pinansicht sollte nicht eine Unteransicht der Kartenansicht sein.
  3. Die Pin-Ansicht sollte eine Unteransicht derselben Ansicht sein, in der die Kartenansicht eine Unteransicht von ist (z. B. sollten beide Subviews derselben Superview sein).
  4. Die Pinansicht sollte so groß und so positioniert sein, dass sie über der Mitte der Kartenansicht erscheint (Sie könnten die Pinansicht denselben Frame und die gleiche automatische Layout-/Autoresierungslogik wie die Kartenansicht haben, sodass sie trotzdem visuell synchronisiert bleiben) Bildschirmgröße oder Ausrichtung).
  5. Wenn Sie UIImageView verwenden, stellen Sie den Inhaltmodus auf "Mitte" und die Hintergrundfarbe auf "Löschen".
  6. Die Pin-Ansicht sollte Benutzerinteraktion deaktiviert haben auf es, damit der Benutzer noch mit der Kartenansicht dahinter interagieren kann. Wenn der Benutzer die Kartenansicht schwenkt oder zoomt, scheint sich die Stiftansicht vorne zu bewegen.
  7. Bei Bedarf kann die App die Standortkoordinaten von mapView.centerCoordinate in der Delegiertenmethode regionDidChangeAnimated: (oder Schwenk/Pinch-Gestenerkenner) abrufen oder nur, wenn der Benutzer sagt, dass die Positionierung abgeschlossen ist. Ich empfehle nicht, einen Timer (insbesondere alle 0,00001s) zu verwenden, um die aktuelle Mittelkoordinate abzufragen.
  8. Wenn der Benutzer angibt, dass an der aktuellen Position die Annotation platziert werden soll, können Sie eine tatsächliche Annotation an dieser Koordinate erstellen und hinzufügen und die Pin-Ansicht "Positionseinstellungsmodus" ausblenden.
+0

Haha, fair genug. Ich dachte auch darüber nach, aber ich war wohl zu stur und wollte es über die Mnnotationsmanipulation funktionieren lassen. Danke, dass du mir den Schub gegeben hast, den ich brauchte.Schöne Ferien! –

+0

Das funktioniert sehr gut. – quantumpotato