放大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然后使用MKMapRectUnionhttp://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))