tutorial manager example corelocation iphone objective-c cocoa-touch

iphone - manager - ¿Zoom MKMapView para caber en los pines de anotación?



location manager swift tutorial (24)

@ "No estoy seguro de si esto se debe a otros factores en mi implementación, pero me parece que showAnnotations no hace un acercamiento / ajuste de las anotaciones como lo hace la implementación manual, así que me he quedado con el manual uno. - Ted Avery 17 de abril a las 0:35 "

Tuve el mismo problema, pero luego intenté hacer showAnnotations dos veces (como a continuación), y por alguna razón, funcionó.

[mapView showAnnotations: yourAnotationArray animated: YES]; [mapView showAnnotations: yourAnotationArray animated: YES];

Estoy usando MKMapView y he agregado una cantidad de pines de anotación al mapa sobre un área de 5-10 kilómetros. Cuando ejecuto la aplicación, mi mapa comienza a alejarse para mostrar todo el mundo, ¿cuál es la mejor manera de acercar el mapa para que los pines se ajusten a la vista?

EDITAR: Mi pensamiento inicial sería usar MKCoordinateRegionMake y calcular el centro de coordenadas, longitudeDelta y latitudeDelta de mis anotaciones. Estoy bastante seguro de que esto funcionará, pero solo quería comprobar que no me faltaba nada obvio.

Código agregado, BTW: FGLocation es una clase que se ajusta a MKAnnotation , locationFake es un NSMutableArray de estos objetos. Los comentarios son siempre bienvenidos ...

- (MKCoordinateRegion)regionFromLocations { CLLocationCoordinate2D upper = [[locationFake objectAtIndex:0] coordinate]; CLLocationCoordinate2D lower = [[locationFake objectAtIndex:0] coordinate]; // FIND LIMITS for(FGLocation *eachLocation in locationFake) { if([eachLocation coordinate].latitude > upper.latitude) upper.latitude = [eachLocation coordinate].latitude; if([eachLocation coordinate].latitude < lower.latitude) lower.latitude = [eachLocation coordinate].latitude; if([eachLocation coordinate].longitude > upper.longitude) upper.longitude = [eachLocation coordinate].longitude; if([eachLocation coordinate].longitude < lower.longitude) lower.longitude = [eachLocation coordinate].longitude; } // FIND REGION MKCoordinateSpan locationSpan; locationSpan.latitudeDelta = upper.latitude - lower.latitude; locationSpan.longitudeDelta = upper.longitude - lower.longitude; CLLocationCoordinate2D locationCenter; locationCenter.latitude = (upper.latitude + lower.latitude) / 2; locationCenter.longitude = (upper.longitude + lower.longitude) / 2; MKCoordinateRegion region = MKCoordinateRegionMake(locationCenter, locationSpan); return region; }


Apple ha agregado un nuevo método para iOS 7 para simplificar un poco la vida.

[mapView showAnnotations:yourAnnotationArray animated:YES];

Puede extraer fácilmente de una matriz almacenada en la vista del mapa:

yourAnnotationArray = mapView.annotations;

¡y ajuste rápidamente la cámara también!

mapView.camera.altitude *= 1.4;

esto no funcionará a menos que el usuario tenga iOS 7+ o OS X 10.9+ instalado. echa un vistazo a la animación personalizada here


Como señala Abhishek Bedi en un comentario, para iOS7, la mejor manera de hacerlo es:

//from API docs: //- (void)showAnnotations:(NSArray *)annotations animated:(BOOL)animated NS_AVAILABLE(10_9, 7_0); [self.mapView showAnnotations:self.mapView.annotations animated:YES];

Para mi proyecto personal (anterior a iOS7) simplemente agregué una categoría en la clase MKMapView para encapsular la funcionalidad de "área visible" para una operación muy común: configurarla para poder ver todas las anotaciones actualmente cargadas en la instancia MKMapView ( esto incluye tantos pines como haya colocado, así como la ubicación del usuario). el resultado fue esto:

archivo .h

#import <MapKit/MapKit.h> @interface MKMapView (Extensions) -(void)ij_setVisibleRectToFitAllLoadedAnnotationsAnimated:(BOOL)animated; -(void)ij_setVisibleRectToFitAnnotations:(NSArray *)annotations animated:(BOOL)animated; @end

archivo .m

#import "MKMapView+Extensions.h" @implementation MKMapView (Extensions) /** * Changes the currently visible portion of the map to a region that best fits all the currently loadded annotations on the map, and it optionally animates the change. * * @param animated is the change should be perfomed with an animation. */ -(void)ij_setVisibleRectToFitAllLoadedAnnotationsAnimated:(BOOL)animated { MKMapView * mapView = self; NSArray * annotations = mapView.annotations; [self ij_setVisibleRectToFitAnnotations:annotations animated:animated]; } /** * Changes the currently visible portion of the map to a region that best fits the provided annotations array, and it optionally animates the change. All elements from the array must conform to the <MKAnnotation> protocol in order to fetch the coordinates to compute the visible region of the map. * * @param annotations an array of elements conforming to the <MKAnnotation> protocol, holding the locations for which the visible portion of the map will be set. * @param animated wether or not the change should be perfomed with an animation. */ -(void)ij_setVisibleRectToFitAnnotations:(NSArray *)annotations animated:(BOOL)animated { MKMapView * mapView = self; MKMapRect r = MKMapRectNull; for (id<MKAnnotation> a in annotations) { ZAssert([a conformsToProtocol:@protocol(MKAnnotation)], @"ERROR: All elements of the array MUST conform to the MKAnnotation protocol. Element (%@) did not fulfill this requirement", a); MKMapPoint p = MKMapPointForCoordinate(a.coordinate); //MKMapRectUnion performs the union between 2 rects, returning a bigger rect containing both (or just one if the other is null). here we do it for rects without a size (points) r = MKMapRectUnion(r, MKMapRectMake(p.x, p.y, 0, 0)); } [mapView setVisibleMapRect:r animated:animated]; } @end

Como puede ver, agregué 2 métodos hasta ahora: uno para establecer la región visible del mapa que concuerde con todas las anotaciones actualmente cargadas en la instancia MKMapView y otro método para establecerlo en cualquier matriz de objetos. Entonces, para establecer la región visible de mapView, el código sería tan simple como:

//the mapView instance [self.mapView ij_setVisibleRectToFitAllLoadedAnnotationsAnimated:animated];

Espero que ayude =)


Creé una extensión para mostrar todas las anotaciones usando algún código de aquí y de allí en poco tiempo. Esto no mostrará todas las anotaciones si no se pueden mostrar incluso con el nivel de zoom máximo.

import MapKit extension MKMapView { func fitAllAnnotations() { var zoomRect = MKMapRectNull; for annotation in annotations { let annotationPoint = MKMapPointForCoordinate(annotation.coordinate) let pointRect = MKMapRectMake(annotationPoint.x, annotationPoint.y, 0.1, 0.1); zoomRect = MKMapRectUnion(zoomRect, pointRect); } setVisibleMapRect(zoomRect, edgePadding: UIEdgeInsetsMake(20, 20, 20, 20), animated: true) } }


En Swift uso

mapView.showAnnotations(annotationArray, animated: true)

En Objective c

[mapView showAnnotations:annotationArray animated:YES];


Este es el que encontré here que funcionó para mí:

(EDITAR: He actualizado la solución usando la sugerencia de @Micah para aumentar el puntoRect por 0.1 para asegurar que el rect no sea infinitamente pequeño!)

MKMapRect zoomRect = MKMapRectNull; for (id <MKAnnotation> annotation in mapView.annotations) { MKMapPoint annotationPoint = MKMapPointForCoordinate(annotation.coordinate); MKMapRect pointRect = MKMapRectMake(annotationPoint.x, annotationPoint.y, 0.1, 0.1); zoomRect = MKMapRectUnion(zoomRect, pointRect); } [mapView setVisibleMapRect:zoomRect animated:YES];

También puede actualizar esto para incluir el pin userLocation reemplazando la primera línea con:

MKMapPoint annotationPoint = MKMapPointForCoordinate(mapView.userLocation.coordinate); MKMapRect zoomRect = MKMapRectMake(annotationPoint.x, annotationPoint.y, 0.1, 0.1);


Gracias a jowie, actualicé mi antigua categoría a una solución más elegante. Compartir una solución completa, casi copiar y pegar

MKMapView + AnnotationsRegion.h

#import <MapKit/MapKit.h> @interface MKMapView (AnnotationsRegion) -(void)updateRegionForCurrentAnnotationsAnimated:(BOOL)animated; -(void)updateRegionForCurrentAnnotationsAnimated:(BOOL)animated edgePadding:(UIEdgeInsets)edgePadding; -(void)updateRegionForAnnotations:(NSArray *)annotations animated:(BOOL)animated; -(void)updateRegionForAnnotations:(NSArray *)annotations animated:(BOOL)animated edgePadding:(UIEdgeInsets)edgePadding; @end

MKMapView + AnnotationsRegion.m

#import "MKMapView+AnnotationsRegion.h" @implementation MKMapView (AnnotationsRegion) -(void)updateRegionForCurrentAnnotationsAnimated:(BOOL)animated{ [self updateRegionForCurrentAnnotationsAnimated:animated edgePadding:UIEdgeInsetsZero]; } -(void)updateRegionForCurrentAnnotationsAnimated:(BOOL)animated edgePadding:(UIEdgeInsets)edgePadding{ [self updateRegionForAnnotations:self.annotations animated:animated edgePadding:edgePadding]; } -(void)updateRegionForAnnotations:(NSArray *)annotations animated:(BOOL)animated{ [self updateRegionForAnnotations:annotations animated:animated edgePadding:UIEdgeInsetsZero]; } -(void)updateRegionForAnnotations:(NSArray *)annotations animated:(BOOL)animated edgePadding:(UIEdgeInsets)edgePadding{ MKMapRect zoomRect = MKMapRectNull; for(id<MKAnnotation> annotation in annotations){ MKMapPoint annotationPoint = MKMapPointForCoordinate(annotation.coordinate); MKMapRect pointRect = MKMapRectMake(annotationPoint.x, annotationPoint.y, 0.1, 0.1); zoomRect = MKMapRectUnion(zoomRect, pointRect); } [self setVisibleMapRect:zoomRect edgePadding:edgePadding animated:animated]; } @end

Espero que ayude a alguien y gracias de nuevo jowie!


He convertido la respuesta de Rafael Moreira. El mérito es para él. Para aquellos de ustedes que buscan la versión Swift, aquí está el código:

func zoomToFitMapAnnotations(aMapView: MKMapView) { guard aMapView.annotations.count > 0 else { return } var topLeftCoord: CLLocationCoordinate2D = CLLocationCoordinate2D() topLeftCoord.latitude = -90 topLeftCoord.longitude = 180 var bottomRightCoord: CLLocationCoordinate2D = CLLocationCoordinate2D() bottomRightCoord.latitude = 90 bottomRightCoord.longitude = -180 for annotation: MKAnnotation in myMap.annotations as! [MKAnnotation]{ topLeftCoord.longitude = fmin(topLeftCoord.longitude, annotation.coordinate.longitude) topLeftCoord.latitude = fmax(topLeftCoord.latitude, annotation.coordinate.latitude) bottomRightCoord.longitude = fmax(bottomRightCoord.longitude, annotation.coordinate.longitude) bottomRightCoord.latitude = fmin(bottomRightCoord.latitude, annotation.coordinate.latitude) } var region: MKCoordinateRegion = MKCoordinateRegion() region.center.latitude = topLeftCoord.latitude - (topLeftCoord.latitude - bottomRightCoord.latitude) * 0.5 region.center.longitude = topLeftCoord.longitude + (bottomRightCoord.longitude - topLeftCoord.longitude) * 0.5 region.span.latitudeDelta = fabs(topLeftCoord.latitude - bottomRightCoord.latitude) * 1.4 region.span.longitudeDelta = fabs(bottomRightCoord.longitude - topLeftCoord.longitude) * 1.4 region = aMapView.regionThatFits(region) myMap.setRegion(region, animated: true) }


He hecho una pequeña modificación del código de Rafael para la categoría MKMapView.

- (void)zoomToFitMapAnnotations { if ([self.annotations count] == 0) return; CLLocationCoordinate2D topLeftCoord; topLeftCoord.latitude = -90; topLeftCoord.longitude = 180; CLLocationCoordinate2D bottomRightCoord; bottomRightCoord.latitude = 90; bottomRightCoord.longitude = -180; for (id <MKAnnotation> annotation in self.annotations) { topLeftCoord.longitude = fmin(topLeftCoord.longitude, annotation.coordinate.longitude); topLeftCoord.latitude = fmax(topLeftCoord.latitude, annotation.coordinate.latitude); bottomRightCoord.longitude = fmax(bottomRightCoord.longitude, annotation.coordinate.longitude); bottomRightCoord.latitude = fmin(bottomRightCoord.latitude, annotation.coordinate.latitude); } MKCoordinateRegion region; region.center.latitude = topLeftCoord.latitude - (topLeftCoord.latitude - bottomRightCoord.latitude) * 0.5; region.center.longitude = topLeftCoord.longitude + (bottomRightCoord.longitude - topLeftCoord.longitude) * 0.5; region.span.latitudeDelta = fabs(topLeftCoord.latitude - bottomRightCoord.latitude) * 1.1; // Add a little extra space on the sides region.span.longitudeDelta = fabs(bottomRightCoord.longitude - topLeftCoord.longitude) * 1.1; // Add a little extra space on the sides [self setRegion:[self regionThatFits:region] animated:YES]; }


La solución de @jowie funciona genial. Una pega, si un mapa tiene solo una anotación, terminará con un mapa totalmente alejado. Agregué 0.1 al rect make size para asegurarme de que setVisibleMapRect tenga algo para acercar.

MKMapRect pointRect = MKMapRectMake(annotationPoint.x, annotationPoint.y, 0.1, 0.1);


Lo tienes bien.

Encuentre sus latitudes y longitudes máximas y mínimas, aplique aritmética simple y utilice MKCoordinateRegionMake .

Para iOS 7 y superior, use showAnnotations:animated: de MKMapView.h :

// Position the map such that the provided array of annotations are all visible to the fullest extent possible. - (void)showAnnotations:(NSArray *)annotations animated:(BOOL)animated NS_AVAILABLE(10_9, 7_0);


Para iOS 7 y superior (refiriéndose a MKMapView.h):

// Position the map such that the provided array of annotations are all visible to the fullest extent possible. - (void)showAnnotations:(NSArray *)annotations animated:(BOOL)animated NS_AVAILABLE(10_9, 7_0);

observación de - Abhishek Bedi

Usted acaba de llamar:

[yourMapView showAnnotations:@[yourAnnotation] animated:YES];


Se agregó este ciclo If en el ciclo for para excluir el pin de ubicación de los usuarios de este método (requerido en mi caso, y tal vez en otros)

if (![annotation isKindOfClass:[MKUserLocation class]] ) { //Code Here... }


Según las respuestas anteriores, puede usar el método universal para acercar el mapa y ajustarlo a todas las anotaciones y superposiciones al mismo tiempo.

-(MKMapRect)getZoomingRectOnMap:(MKMapView*)map toFitAllOverlays:(BOOL)overlays andAnnotations:(BOOL)annotations includeUserLocation:(BOOL)userLocation { if (!map) { return MKMapRectNull; } NSMutableArray* overlaysAndAnnotationsCoordinateArray = [[NSMutableArray alloc]init]; if (overlays) { for (id <MKOverlay> overlay in map.overlays) { MKMapPoint overlayPoint = MKMapPointForCoordinate(overlay.coordinate); NSArray* coordinate = @[[NSNumber numberWithDouble:overlayPoint.x], [NSNumber numberWithDouble:overlayPoint.y]]; [overlaysAndAnnotationsCoordinateArray addObject:coordinate]; } } if (annotations) { for (id <MKAnnotation> annotation in map.annotations) { MKMapPoint annotationPoint = MKMapPointForCoordinate(annotation.coordinate); NSArray* coordinate = @[[NSNumber numberWithDouble:annotationPoint.x], [NSNumber numberWithDouble:annotationPoint.y]]; [overlaysAndAnnotationsCoordinateArray addObject:coordinate]; } } MKMapRect zoomRect = MKMapRectNull; if (userLocation) { MKMapPoint annotationPoint = MKMapPointForCoordinate(map.userLocation.coordinate); zoomRect = MKMapRectMake(annotationPoint.x, annotationPoint.y, 0.1, 0.1); } for (NSArray* coordinate in overlaysAndAnnotationsCoordinateArray) { MKMapRect pointRect = MKMapRectMake([coordinate[0] doubleValue], [coordinate[1] doubleValue], 0.1, 0.1); zoomRect = MKMapRectUnion(zoomRect, pointRect); } return zoomRect; }

Y entonces:

MKMapRect mapRect = [self getZoomingRectOnMap:mapView toFitAllOverlays:YES andAnnotations:YES includeUserLocation:NO]; [mapView setVisibleMapRect:mapRect edgePadding:UIEdgeInsetsMake(10.0, 10.0, 10.0, 10.0) animated:YES];


Si está buscando iOS 8 o superior , la forma más sencilla de hacerlo es configurar el var layoutMargins: UIEdgeInsets { get set } de su vista de mapa antes de llamar a func showAnnotations(annotations: [MKAnnotation], animated: Bool)

Por ejemplo (Swift 2.1):

@IBOutlet weak var map: MKMapView! { didSet { map.delegate = self map.mapType = .Standard map.pitchEnabled = false map.rotateEnabled = false map.scrollEnabled = true map.zoomEnabled = true } } // call ''updateView()'' when viewWillAppear or whenever you set the map annotations func updateView() { map.layoutMargins = UIEdgeInsets(top: 25, left: 25, bottom: 25, right: 25) map.showAnnotations(map.annotations, animated: true) }


Solo compartiendo mis observaciones sobre esto:

Si está utilizando xCode> 6 con tamaños "inferidos" para las pantallas (consulte "métricas simuladas" en el inspector de archivos) en el guión gráfico, llamando

- (void)showAnnotations:(NSArray *)annotations animated:(BOOL)animated

en viewDidLoad resultará en un nivel de zoom demasiado grande en iPhones con 4 pulgadas porque el diseño del mapa aún está en el tamaño de las pantallas más amplias del guión gráfico.

Puede mover su llamada para showAnnotations... a viewDidAppear . Entonces, el tamaño del mapa ya se ha ajustado a la pantalla más pequeña de un iPhone 4.

O alternativamente cambie el valor "inferido" en el inspector de archivos en "métricas simuladas" a iphone de 4 pulgadas.


Swift 3 Esta es la forma correcta de ajustar todas las anotaciones en el mapa.

func zoomMapaFitAnnotations() { var zoomRect = MKMapRectNull for annotation in mapview.annotations { let annotationPoint = MKMapPointForCoordinate(annotation.coordinate) let pointRect = MKMapRectMake(annotationPoint.x, annotationPoint.y, 0, 0) if (MKMapRectIsNull(zoomRect)) { zoomRect = pointRect } else { zoomRect = MKMapRectUnion(zoomRect, pointRect) } } self.mapview.setVisibleMapRect(zoomRect, edgePadding: UIEdgeInsetsMake(50, 50, 50, 50), animated: true) }


Todas las respuestas en esta página suponen que el mapa ocupa la pantalla completa . De hecho, tengo una pantalla HUD (es decir, botones dispersos en la parte superior e inferior) que proporcionan información en la parte superior del mapa ... y los algoritmos de la página mostrarán los pines correctamente, pero algunos de ellos aparecerán debajo de los botones de la pantalla del HUD .

Mi solución amplía el mapa para mostrar las anotaciones en un subconjunto de la pantalla y funciona para diferentes tamaños de pantalla (es decir, 3.5 "frente a 4.0", etc.):

// create a UIView placeholder and throw it on top of the original mapview // position the UIView to fit the maximum area not hidden by the HUD display buttons // add an *other* mapview in that uiview, // get the MKCoordinateRegion that fits the pins from that fake mapview // kill the fake mapview and set the region of the original map // to that MKCoordinateRegion.

Esto es lo que hice en el código (nota: uso NSConstraints con algunos métodos de ayuda para que mi código funcione en diferentes tamaños de pantalla ... mientras que el código es bastante legible ... mi respuesta here explica mejor ... básicamente es el mismo flujo de trabajo: )

// position smallerMap to fit available space // don''t store this map, it will slow down things if we keep it hidden or even in memory [@[_smallerMapPlaceholder] mapObjectsApplyingBlock:^(UIView *view) { [view removeFromSuperview]; [view setTranslatesAutoresizingMaskIntoConstraints:NO]; [view setHidden:NO]; [self.view addSubview:view]; }]; NSDictionary *buttonBindingDict = @{ @"mapPlaceholder": _smallerMapPlaceholder}; NSArray *constraints = [@[@"V:|-225-[mapPlaceholder(>=50)]-176-|", @"|-40-[mapPlaceholder(<=240)]-40-|" ] mapObjectsUsingBlock:^id(NSString *formatString, NSUInteger idx){ return [NSLayoutConstraint constraintsWithVisualFormat:formatString options:0 metrics:nil views:buttonBindingDict]; }]; [self.view addConstraints:[constraints flattenArray]]; [self.view layoutIfNeeded]; MKMapView *smallerMap = [[MKMapView alloc] initWithFrame:self.smallerMapPlaceholder.frame]; [_smallerMapPlaceholder addSubview:smallerMap]; MKCoordinateRegion regionThatFits = [smallerMap getRegionThatFits:self.mapView.annotations]; [smallerMap removeFromSuperview]; smallerMap = nil; [_smallerMapPlaceholder setHidden:YES]; [self.mapView setRegion:regionThatFits animated:YES];

aquí está el código que obtiene la región que se ajusta:

- (MKCoordinateRegion)getRegionThatFits:(NSArray *)routes { MKCoordinateRegion region; CLLocationDegrees maxLat = -90.0; CLLocationDegrees maxLon = -180.0; CLLocationDegrees minLat = 90.0; CLLocationDegrees minLon = 180.0; for(int idx = 0; idx < routes.count; idx++) { CLLocation* currentLocation = [routes objectAtIndex:idx]; if(currentLocation.coordinate.latitude > maxLat) maxLat = currentLocation.coordinate.latitude; if(currentLocation.coordinate.latitude < minLat) minLat = currentLocation.coordinate.latitude; if(currentLocation.coordinate.longitude > maxLon) maxLon = currentLocation.coordinate.longitude; if(currentLocation.coordinate.longitude < minLon) minLon = currentLocation.coordinate.longitude; } region.center.latitude = (maxLat + minLat) / 2.0; region.center.longitude = (maxLon + minLon) / 2.0; region.span.latitudeDelta = 0.01; region.span.longitudeDelta = 0.01; region.span.latitudeDelta = ((maxLat - minLat)<0.0)?100.0:(maxLat - minLat); region.span.longitudeDelta = ((maxLon - minLon)<0.0)?100.0:(maxLon - minLon); MKCoordinateRegion regionThatFits = [self regionThatFits:region]; return regionThatFits; }


Una forma compatible con iOS 7 es usar lo siguiente. Primera llamada showAnnotation para obtener un rectángulo que incluya todas las anotaciones. Después crea y UIEdgeInset con un recuadro superior de la altura del pin. Por lo tanto, te aseguras de mostrar el pin completo en el mapa.

[self.mapView showAnnotations:self.mapView.annotations animated:YES]; MKMapRect rect = [self.mapView visibleMapRect]; UIEdgeInsets insets = UIEdgeInsetsMake(pinHeight, 0, 0, 0); [self.mapView setVisibleMapRect:rect edgePadding:insets animated:YES];


Uso este código y funciona bien para mí:

-(void)zoomToFitMapAnnotations:(MKMapView*)aMapView { if([aMapView.annotations count] == 0) return; CLLocationCoordinate2D topLeftCoord; topLeftCoord.latitude = -90; topLeftCoord.longitude = 180; CLLocationCoordinate2D bottomRightCoord; bottomRightCoord.latitude = 90; bottomRightCoord.longitude = -180; for(MapViewAnnotation *annotation in mapView.annotations) { topLeftCoord.longitude = fmin(topLeftCoord.longitude, annotation.coordinate.longitude); topLeftCoord.latitude = fmax(topLeftCoord.latitude, annotation.coordinate.latitude); bottomRightCoord.longitude = fmax(bottomRightCoord.longitude, annotation.coordinate.longitude); bottomRightCoord.latitude = fmin(bottomRightCoord.latitude, annotation.coordinate.latitude); } MKCoordinateRegion region; region.center.latitude = topLeftCoord.latitude - (topLeftCoord.latitude - bottomRightCoord.latitude) * 0.5; region.center.longitude = topLeftCoord.longitude + (bottomRightCoord.longitude - topLeftCoord.longitude) * 0.5; region.span.latitudeDelta = fabs(topLeftCoord.latitude - bottomRightCoord.latitude) * 1.1; // Add a little extra space on the sides region.span.longitudeDelta = fabs(bottomRightCoord.longitude - topLeftCoord.longitude) * 1.1; // Add a little extra space on the sides region = [aMapView regionThatFits:region]; [mapView setRegion:region animated:YES]; }


En Swift

var zoomRect = MKMapRectNull; for i in 0..<self.map.annotations.count { let annotation: MKAnnotation = self.map.annotations[i] let annotationPoint = MKMapPointForCoordinate(annotation.coordinate); let pointRect = MKMapRectMake(annotationPoint.x, annotationPoint.y, 0.1, 0.1); zoomRect = MKMapRectUnion(zoomRect, pointRect); } self.map.setVisibleMapRect(zoomRect, animated: true)


Pon esto en tu código en consecuencia:

- (void)mapView:(MKMapView *)mv didAddAnnotationViews:(NSArray *)views { id<MKAnnotation> mp = [annotationView annotation]; MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance([mp coordinate] ,250,250); [mv setRegion:region animated:YES]; }


var zoomRect: MKMapRect = MKMapRectNull for annotation in mapView.annotations { let annotationPoint = MKMapPointForCoordinate(annotation.coordinate) let pointRect = MKMapRectMake(annotationPoint.x, annotationPoint.y, 0.1, 0.1) zoomRect = MKMapRectUnion(zoomRect, pointRect) } mapView.setVisibleMapRect(zoomRect, animated: true)


- (void)zoomMapViewToFitAnnotationsWithExtraZoomToAdjust:(double)extraZoom { if ([self.annotations count] == 0) return; int i = 0; MKMapPoint points[[self.annotations count]]; for (id<MKAnnotation> annotation in [self annotations]) { points[i++] = MKMapPointForCoordinate(annotation.coordinate); } MKPolygon *poly = [MKPolygon polygonWithPoints:points count:i]; MKCoordinateRegion r = MKCoordinateRegionForMapRect([poly boundingMapRect]); r.span.latitudeDelta += extraZoom; r.span.longitudeDelta += extraZoom; [self setRegion: r animated:YES]; }