Ich verwende MKMapView und habe der Karte eine Reihe von Anmerkungsstiften über einen Bereich von 5 bis 10 Kilometern hinzugefügt. Wenn ich die Anwendung starte, wird meine Karte verkleinert, um die ganze Welt anzuzeigen. Wie kann ich die Karte am besten zoomen, damit die Stifte in die Ansicht passen?
BEARBEITEN: Mein erster Gedanke wäre, MKCoordinateRegionMake zu verwenden und das Koordinatenzentrum, longitudeDelta und latitudeDelta aus meinen Anmerkungen zu berechnen. Ich bin mir ziemlich sicher, dass dies funktionieren wird, aber ich wollte nur überprüfen, ob mir etwas Offensichtliches fehlt.
Code hinzugefügt, BTW: FGLocation ist eine Klasse, die konform ist MKAnnotation
, locationFake ist eines NSMutableArray
dieser Objekte. Kommentare sind immer willkommen ....
- (MKCoordinateRegion)regionFromLocations {
CLLocationCoordinate2D upper = [[locationFake objectAtIndex:0] coordinate];
CLLocationCoordinate2D lower = [[locationFake objectAtIndex:0] coordinate];
// FIND LIMITS
for(FGLocation *eachLocation in locationFake) {
if([eachLocation coordinate].latitude > upper.latitude) upper.latitude = [eachLocation coordinate].latitude;
if([eachLocation coordinate].latitude < lower.latitude) lower.latitude = [eachLocation coordinate].latitude;
if([eachLocation coordinate].longitude > upper.longitude) upper.longitude = [eachLocation coordinate].longitude;
if([eachLocation coordinate].longitude < lower.longitude) lower.longitude = [eachLocation coordinate].longitude;
}
// FIND REGION
MKCoordinateSpan locationSpan;
locationSpan.latitudeDelta = upper.latitude - lower.latitude;
locationSpan.longitudeDelta = upper.longitude - lower.longitude;
CLLocationCoordinate2D locationCenter;
locationCenter.latitude = (upper.latitude + lower.latitude) / 2;
locationCenter.longitude = (upper.longitude + lower.longitude) / 2;
MKCoordinateRegion region = MKCoordinateRegionMake(locationCenter, locationSpan);
return region;
}
quelle
Antworten:
Du hast es richtig gemacht.
Finden Sie Ihre maximalen und minimalen Breiten- und Längengrade, wenden Sie eine einfache Arithmetik an und verwenden Sie sie
MKCoordinateRegionMake
.Für iOS 7 und höher, die Verwendung
showAnnotations:animated:
vonMKMapView.h
:quelle
// Position the map such that the provided array of annotations are all visible to the fullest extent possible.
- (void)showAnnotations:(NSArray *)annotations animated:(BOOL)animated NS_AVAILABLE(10_9, 7_0);
showAnnotations
die Anmerkungen auch zur Karte hinzugefügt werden, selbst wenn bereits eine Anmerkung für diesen Ort vorhanden ist.removeAnnotations(_ annotations:)
sofort nachshowAnnotations(_ annotations:animated)
Dies ist die, die ich hier gefunden habe und die für mich funktioniert hat:
(BEARBEITEN: Ich habe die Lösung mit dem Vorschlag von @ Micah aktualisiert, den pointRect um 0,1 zu erhöhen, um sicherzustellen, dass der Rect nicht unendlich klein wird!)
Sie können dies auch aktualisieren, um den userLocation-Pin einzuschließen, indem Sie die erste Zeile durch Folgendes ersetzen:
quelle
Apple hat eine neue Methode für IOS 7 hinzugefügt, um das Leben ein wenig zu vereinfachen.
Sie können ganz einfach aus einem in der Kartenansicht gespeicherten Array ziehen:
und schnell auch die Kamera einstellen!
Dies funktioniert nur, wenn auf dem Benutzer iOS 7+ oder OS X 10.9+ installiert ist. Schauen Sie sich hier die benutzerdefinierte Animation an
quelle
showAnnotations
das Zoomen / Anpassen der Anmerkungen nicht so eng ist wie bei der manuellen Implementierung, daher habe ich mich an die manuelle gehalten.Ich benutze diesen Code und funktioniert gut für mich:
quelle
Im Swift-Einsatz
In Ziel c
quelle
mapView.showAnnotations(mapView.annotations, animated: true)
Ich habe die Antwort von Rafael Moreira konvertiert. Der Kredit geht an ihn. Für diejenigen unter Ihnen, die nach der Swift-Version suchen, ist hier der Code:
quelle
Swift 3 Dies ist die richtige Methode, um alle Anmerkungen in die Karte einzupassen.
quelle
@ jowies Lösung funktioniert großartig. Ein Haken: Wenn eine Karte nur eine Anmerkung enthält, erhalten Sie eine vollständig herausgezoomte Karte. Ich habe der Rect-Make-Größe 0,1 hinzugefügt, um sicherzustellen, dass setVisibleMapRect etwas zum Zoomen hat.
quelle
Wenn Sie nach iOS 8 und höher suchen , ist es am einfachsten,
var layoutMargins: UIEdgeInsets { get set }
die Kartenansicht vor dem Anruf festzulegenfunc showAnnotations(annotations: [MKAnnotation], animated: Bool)
Zum Beispiel (Swift 2.1):
quelle
Ich habe eine Erweiterung erstellt, um alle Anmerkungen mit etwas Code von hier und da in Kürze anzuzeigen. Dies zeigt nicht alle Anmerkungen an, wenn sie auch bei maximaler Zoomstufe nicht angezeigt werden können.
quelle
UIEdgeInsetsMake
Parameter konnte ich bessere Ergebnisse erzielen . Werte zwischen 30 und 100 waren gut für mich. Ich habe mit dem iPhone SE i) S 10.2 Simulator getestet. Beispielcode :setVisibleMapRect(zoomRect, edgePadding: UIEdgeInsetsMake(100, 100, 100, 100), animated: true)
. Dieser Code funktioniert in Swift 3 und XCode 8.2.1.Diese If-Schleife innerhalb der for-Schleife wurde hinzugefügt, um den Standort-Pin des Benutzers von dieser Methode auszuschließen (in meinem Fall erforderlich, und möglicherweise auch in anderen).
quelle
Für iOS 7 und höher (siehe MKMapView.h):
Bemerkung von - Abhishek Bedi
Sie rufen einfach an:
quelle
In Swift
quelle
// Bearbeitet für Swift 5
quelle
Dank jowie habe ich meine alte Kategorie auf eine elegantere Lösung aktualisiert. Teilen Sie die vollständige, fast kopier- und einfügebereite Lösung
MKMapView + AnnotationsRegion.h
MKMapView + AnnotationsRegion.m
Hoffe es hilft jemandem und danke nochmal jowie!
quelle
quelle
Wie Abhishek Bedi in einem Kommentar betont, ist für iOS7 Forward der beste Weg, dies zu tun ,:
Für mein persönliches Projekt (vor iOS7) habe ich der MKMapView-Klasse einfach eine Kategorie hinzugefügt, um die Funktionalität "Sichtbarer Bereich" für eine sehr häufige Operation zu kapseln: Festlegen, dass alle aktuell geladenen Anmerkungen in der MKMapView-Instanz angezeigt werden ( Dies umfasst so viele Pins, wie Sie möglicherweise platziert haben, sowie den Standort des Benutzers. Das Ergebnis war:
.h Datei
.m Datei
Wie Sie sehen, habe ich bisher zwei Methoden hinzugefügt: eine zum Festlegen des sichtbaren Bereichs der Karte auf den Bereich, der für alle aktuell geladenen Anmerkungen in der MKMapView-Instanz geeignet ist, und eine andere Methode zum Festlegen eines beliebigen Arrays von Objekten. Um den sichtbaren Bereich von mapView festzulegen, wäre der Code so einfach wie:
Ich hoffe es hilft =)
quelle
Bei allen Antworten auf dieser Seite wird davon ausgegangen, dass die Karte den Vollbildmodus einnimmt . Ich habe tatsächlich eine HUD-Anzeige (dh Schaltflächen, die oben und unten verstreut sind), die Informationen auf der Karte anzeigen. Daher zeigen die Algorithmen auf der Seite die Stifte in Ordnung an, aber einige davon werden unter den Schaltflächen der HUD-Anzeige angezeigt .
Meine Lösung zoomt die Karte heran, um die Anmerkungen in einer Teilmenge des Bildschirms anzuzeigen, und funktioniert für verschiedene Bildschirmgrößen (z. B. 3,5 "gegenüber 4,0" usw.):
Folgendes habe ich im Code getan (Hinweis: Ich verwende
NSConstraints
einige Hilfsmethoden, um meinen Code in verschiedenen Bildschirmgrößen arbeiten zu lassen. Während der Code gut lesbar ist. Meine Antwort hier erklärt es besser. Es ist im Grunde der gleiche Workflow :)Hier ist der Code, der die Region erhält, die passt:
quelle
Ich habe Rafaels Code für die MKMapView-Kategorie ein wenig geändert.
quelle
Basierend auf den obigen Antworten können Sie die Karte mithilfe der universellen Methode zoomen, um alle Anmerkungen und Überlagerungen gleichzeitig anzupassen.
Und dann:
quelle
Ich teile nur meine Beobachtungen dazu:
Wenn Sie xCode> 6 mit "abgeleiteten" Größen für die Bildschirme (siehe "simulierte Metriken" im Dateiinspektor) im Storyboard verwenden, rufen Sie auf
- (void)showAnnotations:(NSArray *)annotations animated:(BOOL)animated
In
viewDidLoad
führt bei iPhones mit 4 Zoll zu einer zu großen Zoomstufe, da das Layout für die Karte immer noch der Größe der breiteren Bildschirme des Storyboards entspricht.Sie können Ihren Anruf
showAnnotations...
nach verschiebenviewDidAppear
. Dann wurde die Größe der Karte bereits an den kleineren Bildschirm eines iPhone 4 angepasst.Oder ändern Sie alternativ den Wert "abgeleitet" im Dateiinspektor unter "simulierte Metriken" in "iPhone 4-Zoll".
quelle
Sie können auswählen, welche Formen Sie zusammen mit den Anmerkungen anzeigen möchten.
quelle
@ "Ich bin nicht sicher, ob dies auf einige andere Faktoren in meiner Implementierung zurückzuführen ist, aber ich finde, dass showAnnotations das Zoomen / Anpassen der Anmerkungen nicht so genau bewirkt wie die manuelle Implementierung, daher habe ich mich an die gehalten Handbuch eins. - Ted Avery 17. April um 0:35 "
Ich hatte das gleiche Problem, aber dann habe ich zweimal versucht, showAnnotations zu machen (wie unten), und aus irgendeinem Grund hat es funktioniert.
[mapView showAnnotations: yourAnnotationArray animiert: YES]; [mapView showAnnotations: yourAnnotationArray animiert: YES];
quelle
Eine iOS 7-kompatible Methode besteht darin, Folgendes zu verwenden. Rufen Sie zuerst
showAnnotation
auf, um ein Rechteck mit allen Anmerkungen zu erhalten. Anschließend erstellen undUIEdgeInset
mit einem oberen Einsatz der Stifthöhe. So stellen Sie sicher, dass der gesamte Pin auf der Karte angezeigt wird.quelle
Fügen Sie dies entsprechend in Ihren Code ein:
quelle