Ich habe mehrere Anmerkungen, die ich zu meiner MKMapView hinzufügen möchte (es können 0-n Elemente sein, wobei n im Allgemeinen bei 5 liegt). Ich kann die Anmerkungen gut hinzufügen, aber ich möchte die Größe der Karte so ändern, dass alle Anmerkungen gleichzeitig auf dem Bildschirm angezeigt werden, und ich bin mir nicht sicher, wie ich das tun soll.
Ich habe es -regionThatFits:
mir angesehen, bin mir aber nicht ganz sicher, was ich damit anfangen soll. Ich werde einen Code posten, um zu zeigen, was ich bisher habe. Ich denke, dies sollte eine allgemein einfache Aufgabe sein, aber ich fühle mich bisher ein bisschen mit MapKit überfordert.
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation{
location = newLocation.coordinate;
//One location is obtained.. just zoom to that location
MKCoordinateRegion region;
region.center = location;
//Set Zoom level using Span
MKCoordinateSpan span;
span.latitudeDelta = 0.015;
span.longitudeDelta = 0.015;
region.span = span;
// Set the region here... but I want this to be a dynamic size
// Obviously this should be set after I've added my annotations
[mapView setRegion:region animated:YES];
// Test data, using these as annotations for now
NSArray *arr = [NSArray arrayWithObjects:@"one", @"two", @"three", @"four", nil];
float ex = 0.01;
for (NSString *s in arr) {
JBAnnotation *placemark = [[JBAnnotation alloc] initWithLat:(location.latitude + ex) lon:location.longitude];
[mapView addAnnotation:placemark];
ex = ex + 0.005;
}
// What do I do here?
[mapView setRegion:[mapView regionThatFits:region] animated:YES];
}
Beachten Sie, dass dies alles passiert, wenn ich ein Standortupdate erhalte ... Ich weiß nicht, ob dies ein geeigneter Ort dafür ist. Wenn nicht, wo wäre ein besserer Ort? -viewDidLoad
?
Danke im Voraus.
quelle
MKMapView
und die Methode in geändert- (void) zoomToFitAnnotations:(BOOL)animated
. Funktioniert perfekt!Warum so kompliziert?
quelle
[mapView setVisibleMapRect:mapRect edgePadding:UIEdgeInsetsMake(20.0f, 20.0f, 20.0f, 20.0f) animated:animated];
CLLocationCoordinate2D *coords
Array? Verwendenmalloc()
?r
CGFloat zoomOutPercent = 0.2f; r = MKMapRectMake(r.origin.x-r.size.width*zoomOutPercent, r.origin.y-r.size.height*zoomOutPercent, r.size.width*(1+zoomOutPercent*2), r.size.height*(1+zoomOutPercent*2));
Ich habe etwas Ähnliches getan, um einen Bereich zu verkleinern (oder zu vergrößern), der eine Punktanmerkung und den aktuellen Standort enthält. Sie können dies erweitern, indem Sie Ihre Anmerkungen durchlaufen.
Die grundlegenden Schritte sind:
quelle
MKCoordinateRegionMake
: gist.github.com/1599700 falls jemand noch will es auf diese Weise zu tun.Ich habe eine andere Antwort. Ich wollte den Zoom-to-Fit-Algorithmus selbst implementieren, aber ich dachte mir, dass Apple eine Möglichkeit haben muss , das zu tun, was wir wollten, ohne so viel Arbeit. Die Verwendung des API-Dokuments zeigte schnell, dass ich MKPolygon verwenden konnte, um das zu tun, was benötigt wurde:
Hoffe das hilft.
quelle
Sie können es auch so machen ..
quelle
Basierend auf den Informationen und Vorschlägen von allen habe ich Folgendes gefunden. Vielen Dank für alle in dieser Diskussion für ihren Beitrag :) Dies würde in den View Controller gehen, der die mapView enthält.
quelle
In meinem Fall beginne ich mit CLLocation-Objekten und erstelle Anmerkungen für jedes dieser Objekte.
Ich muss nur zwei Anmerkungen platzieren, daher habe ich einen einfachen Ansatz zum Erstellen des Array von Punkten, aber es könnte leicht erweitert werden, um ein Array mit einer beliebigen Länge bei einer Reihe von CLLocations zu erstellen.
Hier ist meine Implementierung (es ist nicht erforderlich, MKMapPoints zu erstellen):
quelle
Mit Swift, einem Polygon und einigen zusätzlichen Auffüllungen habe ich Folgendes verwendet:
quelle
Ab 'iOS 7 gibt es in' MKMapView 'eine neue Methode, die Sie verwenden können
quelle
Ich weiß, dass dies eine alte Frage ist, aber wenn Sie alle Anmerkungen BEREITS auf der Karte anzeigen möchten, verwenden Sie Folgendes:
quelle
Hier ist das SWIFT-Äquivalent (Bestätigtes Arbeiten in: Xcode6.1, SDK 8.2) für Mustafas Antworten:
quelle
Eine mögliche Lösung könnte darin bestehen, den Abstand zwischen dem aktuellen Standort und allen Anmerkungen zu messen und mithilfe der MKCoordinateRegionMakeWithDistance-Methode einen Bereich zu erstellen, der einen etwas größeren Abstand als die am weitesten entfernte Anmerkung aufweist.
Dies würde natürlich langsamer werden, je mehr Anmerkungen Sie hinzugefügt haben.
quelle
quelle
Basierend auf der hervorragenden Antwort von
me2
(jetzt in Swift)quelle
Es wurde eine kleine if-Klausel hinzugefügt, um 1 Speicherort zu behandeln - um das Cound-Code-Snippet von Mustufa zu ergänzen. Verwendete die zoomToAnnotation-Funktion von pkclSoft dafür:
quelle
Dieser Code funktioniert für mich. Er zeigt alle Pins mit der aktuellen Position an. Ich hoffe, das hilft Ihnen.
quelle
Ich hoffe, das ist zumindest relevant, das habe ich für Mono zusammengestellt (basierend auf der Antwort von pkclSoft):
quelle
quelle
Basierend auf der Antwort von me2 habe ich eine Kategorie für MKMapView geschrieben, um einige Ränder hinzuzufügen und Anmerkungen zum Benutzerstandort zu überspringen:
quelle
Da ich eine Antwort nicht kommentieren kann, möchte ich der Antwort von @ me2 ein wenig Bequemlichkeit hinzufügen (da ich dachte, es sei der eleganteste Ansatz, der hier zu finden ist).
Für mein persönliches Projekt habe ich der MKMapView-Klasse einfach eine Kategorie hinzugefügt, um die Funktion "Sichtbarer Bereich" für eine sehr häufige Operation zu kapseln: Einstellung, um alle aktuell geladenen Anmerkungen in der MKMapView-Instanz anzeigen zu können. 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 diejenige, die 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
Betrachten Sie diese Erweiterung:
quelle
Eine schnelle 5-Version:
quelle