Estoy usando MKMapView y he agregado varios 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 el mundo entero, ¿cuál es la mejor manera de hacer zoom 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 a partir de mis anotaciones. Estoy bastante seguro de que esto funcionará, pero solo quería comprobar que no me faltaba nada obvio.
Código agregado, por cierto: FGLocation es una clase que se ajusta a MKAnnotation
, locationFake es uno 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;
}
ios
objective-c
iphone
cocoa-touch
mkmapview
fuzzygoat
fuente
fuente
Respuestas:
Lo has entendido bien.
Encuentre sus latitudes y longitudes máximas y mínimas, aplique una aritmética simple y úsela
MKCoordinateRegionMake
.Para iOS 7 y superior, use
showAnnotations:animated:
, desdeMKMapView.h
:fuente
// 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);
showAnnotations
también agrega las anotaciones al mapa, incluso si ya existe una anotación para esa ubicación.removeAnnotations(_ annotations:)
inmediatamente despuésshowAnnotations(_ annotations:animated)
Este es el que encontré aquí que me funcionó:
(EDITAR: ¡He actualizado la solución usando la sugerencia de @ Micah para aumentar el pointRect en 0.1 para asegurar que el rect no termine siendo infinitesimalmente pequeño!)
También puede actualizar esto para incluir el pin de ubicación del usuario reemplazando la primera línea con:
fuente
Apple ha agregado un nuevo método para iOS 7 para simplificar un poco la vida.
Puede extraer fácilmente de una matriz almacenada en la vista de mapa:
¡y ajuste rápidamente la cámara también!
esto no funcionará a menos que el usuario tenga instalado iOS 7+ u OS X 10.9+. echa un vistazo a la animación personalizada aquí
fuente
showAnnotations
no hace un zoom / ajuste de las anotaciones tan cercano como lo hace la implementación manual, así que me quedé con la manual.Utilizo este código y funciona bien para mí:
fuente
En uso rápido
En el objetivo c
fuente
mapView.showAnnotations(mapView.annotations, animated: true)
He convertido la respuesta de Rafael Moreira. El crédito va para él. Para aquellos de ustedes que buscan la versión Swift, aquí está el código:
fuente
Swift 3 Esta es la forma correcta de ajustar todas las anotaciones en el mapa.
fuente
La solución de @jowie funciona muy bien. Una trampa, si un mapa tiene solo una anotación, terminará con un mapa completamente alejado. Agregué 0.1 al tamaño de marca rect para asegurarme de que setVisibleMapRect tiene algo a lo que hacer zoom.
fuente
Si está buscando iOS 8 y superior , la forma más sencilla de hacerlo es configurar
var layoutMargins: UIEdgeInsets { get set }
su vista de mapa antes de llamarfunc showAnnotations(annotations: [MKAnnotation], animated: Bool)
Por ejemplo (Swift 2.1):
fuente
Creé una extensión para mostrar todas las anotaciones usando un código de aquí y de allá en forma rápida. Esto no mostrará todas las anotaciones si no se pueden mostrar incluso con el nivel de zoom máximo.
fuente
UIEdgeInsetsMake
parámetros, los valores entre 30 y 100 fueron buenos para mí. Estaba probando con el iPhone SE i) S 10.2 Simulator. Ejemplo de código:setVisibleMapRect(zoomRect, edgePadding: UIEdgeInsetsMake(100, 100, 100, 100), animated: true)
. Como nota, este código funciona en Swift 3 y XCode 8.2.1.Se agregó este bucle If dentro del bucle for para excluir el pin de ubicación de los usuarios de este método (requerido en mi caso, y tal vez otros)
fuente
Para iOS 7 y superior (en referencia a MKMapView.h):
comentario de - Abhishek Bedi
Tu solo llama:
fuente
En veloz
fuente
// Editado para swift 5
fuente
Gracias a Jowie, actualicé mi categoría anterior a una solución más elegante. Compartir una solución completa, casi lista para copiar y pegar
MKMapView + AnnotationsRegion.h
MKMapView + AnnotationsRegion.m
Espero que ayude a alguien y gracias de nuevo jowie!
fuente
fuente
Como señala Abhishek Bedi en un comentario, para iOS7, la mejor manera de hacerlo es:
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 cargadas actualmente en la instancia de MKMapView ( esto incluye tantos pines como haya colocado, así como la ubicación del usuario). 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 el que se ajusta a todas las anotaciones cargadas actualmente en la instancia de MKMapView, y otro método para configurarlo en cualquier conjunto de objetos. Entonces, para establecer la región visible de mapView, el código sería tan simple como:
Espero que ayude =)
fuente
Todas las respuestas en esta página asumen que el mapa ocupa la pantalla completa . De hecho, tengo una pantalla de HUD (es decir, botones dispersos en la parte superior e inferior) que brindan información sobre el mapa ... y los algoritmos en la página mostrarán los pines correctamente, pero algunos de ellos aparecerán debajo los botones de pantalla de 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 "vs 4.0", etc.):
Esto es lo que hice en el código (nota: lo uso
NSConstraints
con algunos métodos auxiliares para hacer que mi código funcione en diferentes tamaños de pantalla ... mientras que el código es bastante legible ... mi respuesta aquí lo explica mejor ... es básicamente el mismo flujo de trabajo :)Aquí está el código que obtiene la región que se ajusta:
fuente
He hecho una pequeña modificación del código de Rafael para la categoría MKMapView.
fuente
Según las respuestas anteriores, puede utilizar el método universal para hacer zoom en el mapa para que se ajuste a todas las anotaciones y superposiciones al mismo tiempo.
Y entonces:
fuente
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
dará como resultado un nivel de zoom demasiado grande en iPhones con 4 pulgadas porque el diseño del mapa todavía tiene el tamaño de las pantallas más anchas del guión gráfico.Puede mover su llamada
showAnnotations...
aviewDidAppear
. Luego, el tamaño del mapa ya se ha ajustado a la pantalla más pequeña de un iPhone 4.O bien, cambie el valor "inferido" en el inspector de archivos en "métricas simuladas" a iphone de 4 pulgadas.
fuente
Puede seleccionar qué formas desea mostrar junto con las anotaciones.
fuente
@ "No estoy seguro si esto se debe a otros factores en mi implementación, pero encuentro que showAnnotations no hace un zoom / ajuste de las anotaciones tan cerca 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: yourAnnotationArray animado: SÍ]; [mapView showAnnotations: yourAnnotationArray animado: SÍ];
fuente
Una forma compatible con iOS 7 es usar lo siguiente. Primera llamada
showAnnotation
para obtener un rectángulo que incluya todas las anotaciones. Luego cree yUIEdgeInset
con una inserción superior de la altura del pin. Por lo tanto, se asegura de mostrar el pin completo en el mapa.fuente
Pon esto en tu código en consecuencia:
fuente