Anzeige MKMapViewAnnotations innerhalb einer Kartenansicht sichtbar-rect
Ich bin Anzeige einer MKMapView in einem Pfad-Stil parallax-Tabelle Ansicht-Kopfzeile. Um die Wirkung zu erzeugen, die mapView Grenzen ist größer als der Bereich für den Benutzer sichtbar. Ich brauche um die Karte anzuzeigen region, so dass alle anzeigen die Anmerkungen enthalten sind, die innerhalb des sichtbaren rect von MKMapView. Was ist der beste Weg, dies zu tun?
Bearbeiten für Klarheit: Hier ist ein use-case. Die mapView Größe von 320 x 380. Den sichtbaren Bereich, jedoch, ist definiert durch die rect (0.0, 20.0, 320.0, 100.0). Ich brauche, um die region, so dass alle Anmerkungen angezeigt, die in diesem REK in die mapView.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einstellung der Karte die region, so dass alle Anmerkungen enthalten sind, in einem bestimmten Teil eines
MKMapView
erfolgt in drei Schritten. Input sind diemapView
und dieannotationsFrame
.MKMapRect
mapRect
enthält alle Anmerkungen.mapView.bounds
undannotationsFrame
.-setVisibleMapRect:edgePadding:animated:
auf der Karte anzeigen lassen.Unten ist ein Screenshot von einem test. Die roten overlay zeigt die
annotationsFrame
.Hier ist der code. Vorsicht: Es ist alles in eine Methode zu vereinfachen, indem es Ihr code, und es ist nicht geprüft für Grenzfälle wie an in n Anmerkungen mit den gleichen Koordinaten, oder die Anmerkungen, die so weit auseinander, dass die Karte müsste vergrößert zu viel, oder mit den Koordinaten, die sich über den Rand der Karte auf +/-180 Grad Länge.
Wenn Sie gehen für eine perfekte Platzierung (und wer nicht), hier sind drei Dinge zu beachten:
annotationsFrame
, aber die Anmerkungen, die sich möglicherweise außerhalb. Um das zu verhindern, verwenden Sie einfach mehr Polsterung. Zum Beispiel, wenn Sie Ihre Anmerkungen sind 20x20 und zentriert auf die Koordinaten, die Verwendung 10 mehr Polsterung auf allen Seiten.Ab iOS 7.0, dies kann einfach erreicht werden mit
showAnnotations
.Swift:
Objective-C:
Die obige Aussage stellt die map-Ansicht sichtbar rect, um alle Anmerkungen.
Wenn Sie bereit sind Ungefähre Berechnungen, die Sie tun können, es mit einigen cleveren Skalierung.
Ihre Ziel-Bereich ist 80 groß aus eine Kartenansicht, die ist 380. Daher, Sie wollen eine region, 4.75 x größer als die region berechnet, um zu passen Ihre Anmerkungen. (0.25 extra über-und 3,5-extra unten).
Erste, Sie brauchen, um eine region (oder maprect, was auch immer Sie bevorzugen arbeiten) und machen Sie die gleichen Proportionen, wie Sie Ihr Ziel nicht sichtbaren Bereich. Dies ist, weil eine wirklich Breite und kurze region nicht berühren die oberen und unteren Rand des sichtbaren Bereichs liegt und daher die Multiplikation Ihrer Höhe, nicht etwas, das berührt die Ober-und Unterseite der Karte anzeigen. Also, wenn
viewable_height/viewable_width > annotations_height/annotations_width
sollten Sie dieannotations_height
zuannotations_width * (viewable_height/viewable_width)
.Mit, die Sie dann fügen Sie 25% auf den Norden der Anmerkungen-box und 350% auf den Süden. Sie können dies tun, durch verschieben der Mitte 212.5% (von der aktuellen Höhe) von Süden und die Erhöhung der vertikale Spannweite von 475%.
Nun, all dies ist eine Annäherung gegeben, dass die Welt ist die Sphäre, und wir sind nicht auf der Suche an einer planaren Projektion (d.h. 1 Breitengrad nahe dem äquator gezogen wird, die kleiner als 1 Grad in der Nähe der Pole). Aber wenn du wally wollen, um genau zu sein kann man sich in der Skalierung die zahlen je nach Breitengrad und solche. Wenn Sie nur den Umgang mit Annotationen auf eine Stadt-Größe skalieren, werden Sie wahrscheinlich ok.
Hoffe, das hilft.
wenn Sie wollen finden der Annotationen, die in einem bestimmten rect:
sowie sicherzustellen, dass die annotation-ANSICHTEN sind in der rect, Holen Sie sich die region für die Anmerkungen,
dann gehen Sie durch Sie und erhalten Sie jedes view die Grenzen sehen, wenn die Grenzen innerhalb der fit visibleRect der Karte und wenn nicht, ändern Sie die region!
~~ wie diese:
Müssen Sie zunächst die Anmerkungen:
(natürlich ist dies, nachdem Sie bereits eine Liste der Anmerkungen)
Können Sie die currentView-Konstante oder direkt Ort, der MKMapRect wie folgt: Unten: (.visibleMapRect gibt:
"Der Bereich aktuell angezeigten Kartenausschnitt."
Fand ich einen einfacheren Weg, ohne die Berechnung ist ließ der Karte anzeigen berechnen, dann passen wir die Kanten.
Versuchen, alle Ihre Anmerkungen Kanten Wert (max und min) für lan und lon.
Definieren Sie diesen Wert am Anfang:
und dann verwenden Sie diese Funktion, um zu berechnen erstrecken und region:
Verwendung in der viewDidLoad-Methode: