iphone - MKMapView Zoom y región
cocoa-touch mapkit (5)
Estoy familiarizado con el uso de Google Maps JavaScript API. Recientemente comencé a usar el framework MapKit para un proyecto de iphone, pero estoy teniendo un momento difícil para descifrar y establecer una región en el mapa.
En la API de Google Maps solía usar niveles enteros de zoom como 8, 9, 10 junto con la función simple setZoom (). El único método equivalente que puedo ver en el marco de MapKit es setRegion: animado. Según tengo entendido, necesito establecer los valores de "delta" de latitud y longitud del tramo de una región para especificar el nivel de zoom. Pero realmente no tengo una idea de lo que representan estos valores (leí la documentación).
Cuando uso un delegado MKMapView y rastreo los valores span en regionDidChange, los resultados del método delegado no parecen correlacionarse entre sí. Está bien cuando alejo y veo que los valores delta del span están aumentando según lo especificado en la documentación. Pero de repente arrastro el mapa sin hacer zoom y los valores delta se convierten en 0.0.
¿Alguien puede explicar cuál es el punto de referencia para estos tramos y deltas? ¿O hay algún algoritmo para convertir un nivel de zoom entero (como 9) a estos valores delta?
Como una pregunta de bonificación, hay alguna forma de especificar un nivel de zoom mínimo-máximo en un MKMapView :)
Gracias
El lapso está en grados de latitud y longitud. Hay un método para construir estructuras de MKCoordinateRegion que toma distancia, en cambio. Puede ser que estés usando MKCoordinateRegionMakeWithDistance para especificar el span, y luego cuando lo controles en regionDidChange, estás viendo en el lat / long span, que es como está almacenado en una estructura MKCoordinateRegion.
Hasta donde yo sé, los niveles enteros de zoom no están disponibles o no son útiles cuando se trabaja con MKMapKit. Yo personalmente prefiero usar las cifras de tramo, es más flexible.
No se puede especificar el zoom máximo y mínimo, y no sé de qué forma hacerlo. MKMapKit es bastante débil en este momento, estoy bastante decepcionado por la falta de funciones.
En primer lugar, MKMapView no utiliza / tiene un conjunto predefinido de niveles de zoom como lo hace Google Maps.
En su lugar, el área visible de un MKMapView se describe utilizando MKCoordinateRegion , que consta de dos valores:
- centro (el punto central de la región), y
- span (el tamaño del área visible alrededor del centro).
El punto central debe ser obvio (es el punto central de la región).
Sin embargo, span (que es un MKCoordinateSpan ) se compone de:
- latitudeDelta (la distancia vertical representada por la región), y
- longitudeDelta (la distancia horizontal representada por la región).
Un breve ejemplo Aquí hay un juguete MKCoordinateRegion:
- centrar:
- latitud: 0
- longitud: 0
- lapso:
- latitudDelta: 8
- LongitudDelta: 6
La región podría describirse utilizando sus coordenadas mínimas y máximas de la siguiente manera:
- coordenada mínima (punto inferior izquierdo):
- latitud: -4
- longitud: -3
- coordenada máxima (punto superior derecho):
- latitud: 4
- longitud: 3
Por lo tanto, puede especificar niveles de zoom alrededor de un punto central utilizando un MKCoordinateSpan de tamaño apropiado. Como una aproximación de los niveles de zoom numérico de Google, podría realizar una ingeniería inversa de los tamaños de tramo que utiliza Google para un nivel de zoom dado y crear un tramo, en consecuencia. (Google describe sus regiones de vista de la misma forma que MKMapView, como centro + intervalo, por lo que puede extraer estos valores de Google Maps).
En cuanto a restringir la región, puedes jugar con este método delegado:
mapView:regionWillChangeAnimated
por ejemplo, cambiando el tamaño de la región a sus niveles de zoom permitidos. (Algo parecido a cómo las vistas de tabla le permitirán desplazarse más allá del borde, pero luego la banda de goma volverá a su lugar). Sin embargo, su kilometraje puede variar, ya que no lo he usado para este propósito.
Por cierto, hay correcciones / mejoras definitivas en OS 3.1 a los aspectos de MapKit que me estaban dando problemas en 3.0.
La categoría de Brant en MKMapView funciona bien. Sin embargo, parece que no se ha actualizado para admitir dispositivos más nuevos con pantallas Retina al calcular mapSizeInPixels.
Se puede arreglar reemplazando esta línea:
CGSize mapSizeInPixels = mapView.bounds.size;
Con esta línea:
CGSize mapSizeInPixels = CGSizeMake(mapView.bounds.size.width * [UIScreen mainScreen].scale, mapView.bounds.size.height * [UIScreen mainScreen].scale);
Si prefiere usar niveles de zoom explícitos en lugar de definir un MKCoordinateSpan, escribí una categoría que agrega soporte para especificar el nivel de zoom de un MKMapView. El código se puede encontrar here .
Una comparación rápida de los niveles de zoom para una ubicación usando maps.google.com al inspeccionar la cadena de enlaces del enlace muestra que los valores dx y dy span aumentan en un factor de 2:
(0.005334, 0.011834) starting span
(0.010668, 0.023668) dx: x2, dy: x2
(0.021335, 0.047337) dx: x2, dy: x2
(0.042671, 0.094671) dx: x2, dy: x2
...