我有一个数组allCollections,它包含用户通过我的iOS应用程序记录的以编程方式创建的CLLocations数组。 allCollections中的每个子数组都包含行程中的所有位置点。
我从allCollections中的数组中的CLLocations中绘制MKPolylines,以表示MKMapView上的这些行程。我的问题是:将折线添加到地图后,我将如何以编程方式缩放和居中地图以显示所有这些?
答案 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
然后使用MKMapRectUnion
(http://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)
-(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
的数组
希望对某人有帮助