缩放MKMapView以适合折线点

时间:2012-11-26 16:47:27

标签: iphone objective-c ios mkmapview cllocation

我有一个数组allCollections,它包含用户通过我的iOS应用程序记录的以编程方式创建的CLLocations数组。 allCollections中的每个子数组都包含行程中的所有位置点。

我从allCollections中的数组中的CLLocations中绘制MKPolylines,以表示MKMapView上的这些行程。我的问题是:将折线添加到地图后,我将如何以编程方式缩放和居中地图以显示所有这些?

8 个答案:

答案 0 :(得分:65)

-(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];
}

答案 1 :(得分: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 :(得分:8)

您可以遍历记录CLLocations坐标的所有max/min,并使用它来设置视图矩形,就像他们在此问题上iOS MKMapView zoom to show all markers一样。

或者您可以浏览每个叠加层并获取boundingMapRect然后使用MKMapRectUnionhttp://developer.apple.com/library/ios/documentation/MapKit/Reference/MapKitFunctionsReference/Reference/reference.html#//apple_ref/c/func/MKMapRectUnion)将它们全部合并,直到您有一个覆盖它们的MKMapRect all并使用它来设置视图。

[mapView setVisibleMapRect:zoomRect animated:YES]

这个问题显示了一个简单的循环,根据我的建议将联合体中的maprects组合在一起:MKMapRect zooms too much

答案 3 :(得分:7)

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

这将缩放/平移以适应所有叠加的缓冲区

答案 4 :(得分:7)

Swift 3 版本的garafajon优秀代码

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

答案 5 :(得分:6)

Swift 4 /略微修改版本的筹款人答案。

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

使用路线的折线调用上面的内容并保留默认的非动画效果,并添加10个小边缘插图:

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

答案 6 :(得分:0)

@Fundtimer指出正确的方式,唯一的问题是Padding需要根据视觉需求进行调整,这样它将支持所有其他叠加层,并且以下是所有叠加层的通用解决方案。

-(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];
}

答案 7 :(得分:0)

我对此问题有另一种解决方法

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

坐标为CLLocationCoordinate2D的数组

希望对某人有帮助