webentwicklung-frage-antwort-db.com.de

Zoomen Sie MKMapView, um Polylinienpunkte anzupassen

Ich habe ein Array, allCollections, das programmgesteuert erstellte Arrays von CLLocations enthält, die der Benutzer über meine iOS-App aufgezeichnet hat. Jedes Unterarray in allCollections enthält alle Positionspunkte einer Reise.

Ich zeichne MKPolylines aus den CLLocations in den Arrays in allCollections, um diese Trips auf einer MKMapView darzustellen. Meine Frage lautet: Wie würde ich mit den der Karte hinzugefügten Polylinien programmgesteuert zoomen und die Karte zentrieren, um sie alle anzuzeigen?

24
user768339
-(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];
}
63
fundtimer
-(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];
}
14
Tom

Sie können alle CLLocationsname__-Aufzeichnungen der max/min-Koordinaten durchlaufen und damit eine Ansicht wie bei dieser Frage korrigieren iOS MKMapView-Zoom, um alle Markierungen anzuzeigen .

Oder Sie können die einzelnen Overlays durchgehen und den Namen der boundingMapRect abrufen und dann MKMapRectUnion verwenden ( http://developer.Apple.com/library/ios/documentation/MapKit/Reference/MapKitFunctionsReference/Reference/reference.html#//Apple_ref/c/func/MKMapRectUnion ), um sie alle zu kombinieren, bis Sie einen MKMapRecthaben, der sie alle abdeckt, und verwenden Sie diesen, um die Ansicht festzulegen.

[mapView setVisibleMapRect:zoomRect animated:YES]

Diese Frage zeigt eine einfache Schleife, in der die Map-Korrekturen in Gewerkschaften kombiniert werden, wie ich vorgeschlagen habe: MKMapRect zoomt zu stark

8
Craig

Swift 3 Version von Garafajon ausgezeichneten 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)
    }
7
Burf2000

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)
}

dadurch wird gezoomt/geschwenkt, um alle Überlagerungen mit einem kleinen Puffer zu versehen

7
garafajon

Swift 4/leicht abgewandelte Version der Fundtimer-Antwort.

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

Rufen Sie das Obige unter Verwendung der Polylinie einer Route auf und lassen Sie die Standardeinstellung "Nicht animiert", und fügen Sie ringsum kleine Randeinfügungen von 10 hinzu:

setVisibleMapArea(polyline: route.polyline, edgeInsets: UIEdgeInsetsMake(10.0, 10.0, 10.0, 10.0))
6
Jess

@Fundtimer zeigte es richtig an. Das einzige ist, dass das Padding an die visuellen Bedürfnisse angepasst werden muss. Auf diese Weise werden alle anderen Overlays unterstützt. Das Folgende ist 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
iLearner

Ich habe eine andere Lösung für dieses Problem

private func mapRegion() -> MKCoordinateRegion? {


    let latitudes = self.coordinates.map { location -> Double in

        return location.latitude
    }

    let longitudes = self.coordinates.map { location -> Double in

        return location.longitude
    }

    let maxLat = latitudes.max()!
    let minLat = latitudes.min()!
    let maxLong = longitudes.max()!
    let minLong = longitudes.min()!

    let center = CLLocationCoordinate2D(latitude: (minLat + maxLat) / 2,
                                        longitude: (minLong + maxLong) / 2)
    let span = MKCoordinateSpan(latitudeDelta: (maxLat - minLat) * 1.3,
                                longitudeDelta: (maxLong - minLong) * 1.3)
    return MKCoordinateRegion(center: center, span: span)
}

Wo Koordinaten sind Array von CLLocationCoordinate2D

Hoffe, es ist hilfreich für jemanden

0