Ich habe ein MKMapView
mit annotation pins
. Wenn die Ansicht geladen wurde, wird der nächste Pin gesucht und die Karte wird gezoomt, so dass sowohl der Standort des Benutzers als auch der nächste Pin angezeigt wird. Ich mache das mit [map setRegion:region animated:YES];
. Alles funktioniert bis hierhin. Die gleiche Methode wird auch durch Antippen einer Schaltfläche aufgerufen, die den Benutzer lokalisiert und dann genau das tut, was ich gerade beschrieben habe.
Ich habe auch ein Suchfeld, mit dem der Benutzer nach Kartenpunkten suchen kann. Wenn der Benutzer auf eines der Suchergebnisse klickt, setzt die Karte die Region so, dass der gesuchte Pin in der Mitte ist. Nun, da ist etwas Seltsames. Ich habe diese Region auch animiert, zumindest mache ich den gleichen Befehl wie oben. Wenn der Kartenpunkt jedoch zu weit vom aktuell sichtbaren Teil der Karte entfernt ist, wird die Animation beim Ändern der Region nicht angezeigt. Fehle ich etwas? Ich habe mir schon die Apple-Dokumente angeschaut, sie erwähnen nichts über die maximale Entfernung für Animationen.
Ich freue mich auf jede Hilfe!
Update 1:
Habe es nochmal im Simulator getestet. Eine interessante Tatsache ist, dass wenn ich zum ersten Mal nach einem MapPoint suche und dann ein Suchergebnis auswähle, wird es nicht animiert. Wenn ich eine andere Suche nach der ersten suche und ein Ergebnis auswähle, wird es animiert. Sobald ich auf den Locate-Button tippe, der den Benutzer zurück zu seinem Ort bringt und den nächsten Punkt, den er nicht animiert, für diese setRegion:
und die erste Suche danach. Aber nur im Simulator, auf meinem 4S tut es genau das, was ich in der ursprünglichen Frage oben beschrieben habe.
Update 2:
In den Kommentaren wurde ich gebeten, Beispielkoordinaten anzugeben.
Also hier die Koordinaten für den ersten Schritt (Suche nach dem eigenen Ort und dem nächsten Pin):
Mein Standort: 47.227131 / 8.264251
Nächster Pin: 47.251347 / 8.357191
Die Entfernung zwischen ihnen beträgt etwa 22 Kilometer. Das Zentrum der Karte ist das Zentrum zwischen den beiden Pins. Die Entfernung von der Mitte zur Bildschirmgrenze beträgt das 1,5-fache der Entfernung zwischen den beiden Punkten, was in diesem Fall etwa 33 km bedeutet.
Und hier eine Reihe von Koordinaten für den zweiten Schritt (Suchen und Auswählen eines Kartenpunkts):
Gesuchter Stift: 46.790680 / 9.818824
Die Entfernung zum Bildschirmrand ist hier auf 500 Meter festgelegt.
Ich habe dieses Problem mit einer einfachen Demo-Anwendung auf iOS 6 und iOS 7 getestet. Es stellt sich heraus, dass die Kartenansicht den Übergang zwischen den Regionen nicht immer animiert. Es kommt darauf an, wie weit die Regionen auseinander liegen. Zum Beispiel ist ein Übergang von Paris nach London nicht animiert. Aber wenn Sie zuerst ein wenig auszoomen und dann nach London gehen, wird es animiert.
Die Dokumentation sagt:
animiert: Geben Sie YES an, wenn die Kartenansicht animiert werden soll Übergang in die neue Region oder NEIN, wenn die Karte zentriert werden soll die angegebene Region sofort.
Aber wie wir gesehen haben, können wir uns nicht auf die Animation verlassen. Wir können der Kartenansicht nur mitteilen, dass der Übergang sollte animiert sein sollte. MapKit entscheidet, ob eine Animation geeignet ist. Er teilt dem Delegierten mit, ob der Übergang in -(void)mapView:(MKMapView *)mapView regionWillChangeAnimated:(BOOL)animated
animiert wird.
Um die Regionswechsel in allen Fällen konsistent zu animieren, müssen Sie zuerst in eine Zwischenregion animieren. Sei A die aktuelle Kartenregion und B die Zielregion. Wenn es einen Schnittpunkt zwischen den Regionen gibt, können Sie direkt übergehen. (Verwandle das MKCoordinateRegion
in ein MKMapRect
und benutze MKMapRectIntersection
, um den Schnittpunkt zu finden). Wenn es keinen Schnittpunkt gibt, berechnen Sie eine Region C, die beide Regionen umfasst (verwenden Sie MKMapRectUnion
und MKCoordinateRegionForMapRect
). Gehen Sie dann zuerst zu Region C und in regionDidChangeAnimated
zu Region B.
Beispielcode:
%Vor% %Vor%Diese Hilfsmethode stammt hier
%Vor%Die WWDC 2013-Sitzung 309 Putting Map Kit in Perspektive erklärt, wie komplexe Übergänge in iOS 7 durchgeführt werden.
Für jeden, der dieselbe Frage hat und Swift verwendet und eine tableView verwendet:
Ich habe setRegion nach dem Verwerfen der tableView aufgerufen, und es wurde keine Animation angezeigt. Dies ist mein Code vor der Bearbeitung:
%Vor%Dann änderte ich es zu:
%Vor%Diesmal funktioniert es.
Tags und Links objective-c iphone ios mkmapview