33

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

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

4

8 回答 8

71
-(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];
}
于 2013-09-27T03:18:38.953 回答
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];
}
于 2013-02-04T21:51:39.190 回答
14

迅速:

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

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

于 2015-12-07T18:17:46.877 回答
10

您可以遍历所有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覆盖它们并使用它来设置视图。

[mapView setVisibleMapRect:zoomRect animated:YES]

这个问题显示了一个简单的循环,按照我的建议结合了联合中的 maprects:MKMapRect zooms too much

于 2012-11-26T20:45:44.667 回答
8

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)
    }
于 2017-03-17T10:45:50.633 回答
7

Swift 4 / Fundtimer 答案的略微修改版本。

 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))
于 2017-11-15T07:55:24.193 回答
1

我有另一个解决这个问题的方法

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

希望对某人有帮助

于 2019-02-01T04:56:55.667 回答
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];
}
于 2017-07-25T06:54:43.333 回答