2012-11-26 8 views
23

Ich habe ein Array, allCollections, das programmgesteuert erstellte CLLocations-Arrays enthält, die der Benutzer über meine iOS-App aufgezeichnet hat. Jedes Unterfeld in allCollections enthält alle Positionspunkte einer ausgeführten Reise.Zoom MKMapView zum Anpassen von Polylinienpunkten

Ich zeichne MKPolylines aus den CLLocations in den Arrays in allCollections, um diese Reisen auf einem MKMapView darzustellen. Meine Frage ist folgende: Wie würde ich mit den Polylinien, die der Karte hinzugefügt wurden, die Karte programmatisch zoomen und zentrieren, um sie alle anzuzeigen?

+0

meine Antwort geholfen hat? – Craig

Antwort

7

Sie könnten durch alle CLLocations Schleifen die max/min Koordinaten aufzeichnen und verwenden, um eine Ansicht rect wie sie auf diese Frage iOS MKMapView zoom to show all markers setzen.

Oder Sie könnten jede Ihrer Overlays gehen und bekommen ihre boundingMapRect dann verwenden MKMapRectUnion (http://developer.apple.com/library/ios/documentation/MapKit/Reference/MapKitFunctionsReference/Reference/reference.html#//apple_ref/c/func/MKMapRectUnion), sie zu kombinieren alle, bis Sie einen MKMapRect haben, dass deckt sie alle und dass die Ansicht festzulegen verwenden.

[mapView setVisibleMapRect:zoomRect animated:YES] 

Diese Frage zeigt eine einfache Schleife, um die maprects in Gewerkschaften kombiniert, wie ich vorgeschlagen: MKMapRect zooms too much

+0

Ich schulde dir dafür ein Bier :) – Devarshi

14
-(void)zoomToPolyLine: (MKMapView*)map polyLine: (MKPolyline*)polyLine 
animated (BOOL)animated 
{ 
MKPolygon* polygon = 
    [MKPolygon polygonWithPoints:polyLine.points count:polyLine.pointCount]; 

[map setRegion:MKCoordinateRegionForMapRect([polygon boundingMapRect]) 
    animated:animated]; 
} 
+2

Es ist nicht notwendig, ein MKPolygon zu erstellen, da MKPolyline bereits BoundingMapRect implementiert – foOg

+0

Wie weigst du fence zu CLLocation? bedeutet in goefencing, wie Sie diese CLregion anstelle der kreisförmigen Region zuweisen ??? – magid

59
-(void)zoomToPolyLine: (MKMapView*)map polyline: (MKPolyline*)polyline animated: (BOOL)animated 
{ 
    [map setVisibleMapRect:[polyline boundingMapRect] edgePadding:UIEdgeInsetsMake(10.0, 10.0, 10.0, 10.0) animated:animated]; 
} 
+2

Eine kleine Erklärung mit dem Code ist nett. –

+1

@BradKoch Diese Lösung verwendet 'boundingMapRect', um ein Rechteck zu definieren, das das Polylinien-Overlay umfasst. Dann wird der Kartenzoombereich auf das Rechteck mit 'setVisibleMapRect' gesetzt, wobei die einstellbaren Füllwerte mit' edgePadding' berücksichtigt werden. Ich fand diese Lösung am hilfreichsten, da sie das Problem mit wenigen Codezeilen effizient löst und auch Änderungen im Kartenansichtsbereich durch Einfügungen ermöglicht. – sheepgobeep

+2

Das funktioniert für mich. Aber anscheinend setzt dies den Zoom-Faktor auf ** füllen ** den Bildschirm statt ** fit **. Können Sie sich eine Lösung für das –

7

in swift:

if let first = mapView.overlays.first { 
    let rect = mapView.overlays.reduce(first.boundingMapRect, combine: {MKMapRectUnion($0, $1.boundingMapRect)}) 
    mapView.setVisibleMapRect(rect, edgePadding: UIEdgeInsets(top: 50.0, left: 50.0, bottom: 50.0, right: 50.0), animated: true) 
} 

diese zoomt/Pfanne zu passen alle Overlays mit etwas Puffer

4

Swift 3 Version von garafajon hervorragende Code

if let first = self.mapView.overlays.first { 
     let rect = self.mapView.overlays.reduce(first.boundingMapRect, {MKMapRectUnion($0, $1.boundingMapRect)}) 
     self.mapView.setVisibleMapRect(rect, edgePadding: UIEdgeInsets(top: 50.0, left: 50.0, bottom: 50.0, right: 50.0), animated: true) 
    } 
0

@Fundtimer zeigte es richtig, nur ist, dass Padding nach visuellen Bedürfnisse angepasst werden muss, dass die Art und Weise sie alle anderen Overlays unterstützt und finden die generische Lösung für alle Overlays.

-(void)zoomIntoExistingMapObjectForAnnot:(CustomMapAnnotation *)annot 
{ 
    id overlay = annot.shape;//I have overlay property in custom annotation class. 
    [_mapView setVisibleMapRect:[overlay boundingMapRect] edgePadding:UIEdgeInsetsMake(150.0, 150.0, 150.0, 150.0) animated:YES]; 
} 
0

Swift 4/leicht modifizierte Version der Fundtimer-Antwort.

func setVisibleMapArea(polyline: MKPolyline, edgeInsets: UIEdgeInsets, animated: Bool = false) { 
    mapView.setVisibleMapRect(polyline.boundingMapRect, edgePadding: edgeInsets, animated: animated) 
} 

Aufruf der oben eine Route der Polylinie verwenden und die Standardeinstellung nicht animiert zu verlassen, und das Hinzufügen von kleinen Randeinsätze von 10 rundum:

setVisibleMapArea(polyline: route.polyline, edgeInsets: UIEdgeInsetsMake(10.0, 10.0, 10.0, 10.0)) 
Verwandte Themen