Tengo varias anotaciones que quiero agregar a mi MKMapView (podría incluir elementos 0-n, donde n es generalmente alrededor de 5). Puedo agregar las anotaciones bien, pero quiero cambiar el tamaño del mapa para que se ajuste a todas las anotaciones en pantalla a la vez, y no estoy seguro de cómo hacerlo.
Lo he estado mirando -regionThatFits:
pero no estoy muy seguro de qué hacer con él. Publicaré un código para mostrar lo que tengo hasta ahora. Creo que esta debería ser una tarea sencilla en general, pero hasta ahora me siento un poco abrumado con MapKit.
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation{
location = newLocation.coordinate;
//One location is obtained.. just zoom to that location
MKCoordinateRegion region;
region.center = location;
//Set Zoom level using Span
MKCoordinateSpan span;
span.latitudeDelta = 0.015;
span.longitudeDelta = 0.015;
region.span = span;
// Set the region here... but I want this to be a dynamic size
// Obviously this should be set after I've added my annotations
[mapView setRegion:region animated:YES];
// Test data, using these as annotations for now
NSArray *arr = [NSArray arrayWithObjects:@"one", @"two", @"three", @"four", nil];
float ex = 0.01;
for (NSString *s in arr) {
JBAnnotation *placemark = [[JBAnnotation alloc] initWithLat:(location.latitude + ex) lon:location.longitude];
[mapView addAnnotation:placemark];
ex = ex + 0.005;
}
// What do I do here?
[mapView setRegion:[mapView regionThatFits:region] animated:YES];
}
Fíjate, todo esto sucede cuando recibo una actualización de ubicación ... No sé si ese es un lugar apropiado para hacer esto. Si no es así, ¿cuál sería un lugar mejor? -viewDidLoad
?
Gracias por adelantado.
fuente
MKMapView
y cambié el método a- (void) zoomToFitAnnotations:(BOOL)animated
. ¡Funciona perfectamente!¿Por qué tan complicado?
fuente
[mapView setVisibleMapRect:mapRect edgePadding:UIEdgeInsetsMake(20.0f, 20.0f, 20.0f, 20.0f) animated:animated];
CLLocationCoordinate2D *coords
matriz? Usandomalloc()
?r
CGFloat zoomOutPercent = 0.2f; r = MKMapRectMake(r.origin.x-r.size.width*zoomOutPercent, r.origin.y-r.size.height*zoomOutPercent, r.size.width*(1+zoomOutPercent*2), r.size.height*(1+zoomOutPercent*2));
Hice algo similar a esto para alejar (o acercar) un área que incluía una anotación de punto y la ubicación actual. Puede expandir esto recorriendo sus anotaciones.
Los pasos básicos son:
fuente
MKCoordinateRegionMake
: gist.github.com/1599700 en caso de que alguien todavía quiera hacerlo de esta manera.Yo tengo una respuesta diferente. Yo mismo iba a implementar el algoritmo de zoom para ajustar, pero pensé que Apple debía tener una forma de hacer lo que queríamos sin tanto trabajo. El uso de API doco demostró rápidamente que podía usar MKPolygon para hacer lo que se necesitaba:
Espero que esto ayude.
fuente
también puedes hacerlo de esta manera ..
fuente
Basado en la información y sugerencias de todos, se me ocurrió lo siguiente. Gracias a todos en esta discusión por contribuir :) Esto iría en la vista Controlador que contiene mapView.
fuente
En mi caso, estoy comenzando con objetos CLLocation y creando anotaciones para cada uno de ellos.
Solo necesito colocar dos anotaciones, por lo que tengo un enfoque simple para construir la matriz de puntos, pero podría expandirse fácilmente para construir una matriz con una longitud arbitraria dado un conjunto de CLLocations.
Aquí está mi implementación (no requiere la creación de MKMapPoints):
fuente
Usando Swift, un polígono y algo de relleno adicional, usé lo siguiente:
fuente
Hay un nuevo método en 'MKMapView' a partir de iOS 7 que puede usar
fuente
Sé que esta es una pregunta antigua pero, si desea mostrar todas las anotaciones YA EN el mapa, use esto:
fuente
Aquí está el equivalente de SWIFT (trabajo confirmado en: Xcode6.1, SDK 8.2) para las respuestas de Mustafa:
fuente
Una posible solución podría ser medir la distancia entre la ubicación actual y todas las anotaciones y usar el método MKCoordinateRegionMakeWithDistance para crear una región que tenga una distancia ligeramente mayor que la anotación más lejana.
Sin embargo, esto, por supuesto, se volverá más lento cuanto más anotaciones agregue.
fuente
fuente
Basado en la excelente respuesta de
me2
(ahora en Swift)fuente
Se agregó una pequeña cláusula if para manejar 1 ubicación, para agregar al fragmento de código cound de mustufa. Usé la función zoomToAnnotation de pkclSoft para eso:
fuente
este código funciona para mí, muestra todos los pines con la ubicación actual, espero que esto te ayude,
fuente
Espero que esto sea al menos relevante, esto es lo que reuní para Mono (basado en la respuesta de pkclSoft):
fuente
fuente
Basado en la respuesta de me2, escribí una categoría para MKMapView para agregar algunos márgenes y omitir la anotación de ubicación del usuario:
fuente
Como no puedo comentar una respuesta, me gustaría agregar un poco de conveniencia a la respuesta de @ me2 (ya que pensé que era el enfoque más elegante que se encuentra aquí).
Para mi proyecto personal, simplemente agregué una categoría en la clase MKMapView para encapsular la funcionalidad del "área visible" para una operación muy común: configuración para poder ver todas las anotaciones cargadas actualmente en la instancia MKMapView. el resultado fue este:
archivo .h
archivo .m
Como puede ver, he agregado 2 métodos hasta ahora: uno para configurar la región visible del mapa en la que se ajuste a todas las anotaciones cargadas actualmente en la instancia de MKMapView, y otro método para configurarlo en cualquier matriz de objetos. Entonces, para establecer la región visible de mapView, el código sería tan simple como:
Espero que ayude =)
fuente
Considere esta extensión:
fuente
Una versión rápida 5:
fuente
Añadiendo más a la respuesta de Stéphane de Luca . Aquí podemos mantener UserLocation más anotaciones personalizadas para adaptarse a MKMapView
fuente