geocoder iphone objective-c ios mkmapview cllocation

iphone - geocoder - Zoom MKMapView para ajustar puntos de polilínea



core location swift 4 (7)

Tengo una matriz, allCollections, que contiene matrices de CLLocations creadas por programación que el usuario ha grabado a través de mi aplicación iOS. Cada subconjunto en allCollections contiene todos los puntos de ubicación en un viaje realizado.

Extraigo MKPolylines de las CLLocations en los arreglos en allCollections para representar esos viajes en un MKMapView. Mi pregunta es la siguiente: con las polilíneas agregadas al mapa, ¿cómo puedo hacer un zoom programado y centrar el mapa para mostrarlos todos?


@Fundtimer lo señaló de manera correcta. Lo único es que el relleno debe ajustarse según las necesidades visuales, de esa forma será compatible con todas las demás superposiciones y la siguiente es la solución genérica para todas las superposiciones.

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


Puede recorrer todas las CLLocations grabando las coordenadas max/min y usarlas para establecer una vista correcta como lo hacen en esta pregunta iOS MKMapView zoom para mostrar todos los marcadores .

O puede pasar por cada una de sus superposiciones y obtener su boundingMapRect luego usar MKMapRectUnion ( http://developer.apple.com/library/ios/documentation/MapKit/Reference/MapKitFunctionsReference/Reference/reference.html#//apple_ref/c/func/MKMapRectUnion ) para combinarlos todos hasta que tenga un MKMapRect que los cubra a todos y utilícelo para configurar la vista.

[mapView setVisibleMapRect:zoomRect animated:YES]

Esta pregunta muestra un simple bucle que combina los mapeados en uniones como sugerí: MKMapRect amplía demasiado


Swift 4 / versión ligeramente modificada de la respuesta del fundtimer.

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

Llamando a lo anterior usando una polilínea de ruta y dejando el valor predeterminado de no animado, y agregando pequeños bordes de 10 alrededor:

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


en veloz

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

esto hará zoom / paneo para adaptarse a todas las superposiciones con un poco de búfer


Swift 3 version de garafajon excelente codigo

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


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


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