放大MKMapView以适应折线点
我有一个数组allCollections,它包含用户通过iOS应用程序logging的编程创build的CLLocations数组。 allCollections中的每个子数组都包含所采取行程中的所有位置点。
我从allCollections中的数组的CLLocations中绘制MKPolylines来表示MKMapView上的这些行程。 我的问题是这样的:随着折线添加到地图,我将如何去编程缩放和居中地图来显示所有这些?
-(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]; }
-(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]; }
你可以遍历所有loggingmax/min
坐标的CLLocations
并使用它来设置一个视图矩形,就像他们在这个问题上做的一样iOS MKMapView缩放显示所有的标记 。
或者你可以通过你的每个覆盖,并得到他们的boundingMapRect
然后使用MKMapRectUnion
( http://developer.apple.com/library/ios/documentation/MapKit/Reference/MapKitFunctionsReference/Reference/reference.html#//apple_ref/c / func / MKMapRectUnion )来组合它们,直到你有一个覆盖它们的MKMapRect
并使用它来设置视图。
[mapView setVisibleMapRect:zoomRect animated:YES]
这个问题显示了一个简单的循环,在我的build议中结合了工会的maprects: MKMapRect变得太多了
在迅速:
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) }
这将缩放/平移,以适应所有覆盖与一个小缓冲区
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) }
@Fundtimer指出了正确的方法,唯一的问题是,填充需要根据视觉需求进行调整,这样它将支持所有其他覆盖,以下是所有覆盖的通用解决scheme。
-(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]; }
Swift 4 /稍微修改了版本的收集者的答案。
func setVisibleMapArea(polyline: MKPolyline, edgeInsets: UIEdgeInsets, animated: Bool = false) { mapView.setVisibleMapRect(polyline.boundingMapRect, edgePadding: edgeInsets, animated: animated) }
使用路线的多段线调用上述内容,并保留默认值不animation,并添加10个小的边缘插入:
setVisibleMapArea(polyline: route.polyline, edgeInsets: UIEdgeInsetsMake(10.0, 10.0, 10.0, 10.0))
- 使用当前位置数据时,CLGeocoder返回城市和州的空结果
- 如何发送坐标来parsing并保存为parsingPFGeopoint
- 如何从JSON输出中分离纬度和经度值?
- 调用CLLocationManager stopUpdatingLocation后内部GPS天线是否立即停止工作?
- CLLocation的horizontalAccuracy和VerticalAccuracy是指什么?
- 使用CLLocation计算两个坐标之间的距离
- IOS应用程序终止时获取位置更新,而不使用significantChange
- stopRangingBeaconsInRegion可能会停止监视区域的通知?
- 如何计算我们的汽车使用iPhone的速度