2010-11-08 10 views
13

Tengo aproximadamente 400 MKAnnotationView's que se cargan simultáneamente en MKMapView.Cargar anotaciones para la región visible en MKMapView

Entiendo que esto no es bueno, es un poco lento, y quiero hacerlo de la manera "correcta".

i zoom mi mapa por un centro de coordenadas:

MKCoordinateSpan span; 
span.latitudeDelta = 0.8; 
span.longitudeDelta = 0.8; 

MKCoordinateRegion region; 
region.span = span; 

region.center = self.selectedCounty.coordinate; 

[mapView setRegion:region animated:TRUE]; 

Yo sólo quiero cargar las anotaciones que podrían ser visible en esa región.

Tengo una MKAnnotation personalizada llamada simplemente "Anotación" con un CLLocationCoordinate2D- y title-property.

Simplemente quiero cargar la anotación del "área visible" en el MKMapView para que no todas las anotaciones se carguen al mismo tiempo. Y cuando el "área visible" en el MKMapView cambia, por supuesto quiero cargar anotaciones para esa área.

Sé que MKMapView tiene un método delegado que se ejecuta cuando la región cambia.

Pero, ¿cómo sé qué anotaciones debo cargar para esa región?

Respuesta

-2

Puede obtener la extensión y el centro de la región del mapa, y según la ubicación de las anotaciones, puede verificar si hay alguna anotación dentro de esa región ... quizás ya esté implementado en algo como [mapview isAnnotationVisible] ... pero usted tiene que comprobar todo el mundo de las anotaciones eventualmente ...

+1

Lo siento. Pero realmente, realmente no entiendo tu respuesta. –

+1

Cuando agregue las anotaciones a mi MapView, me gustaría verificar: if (thisAnnotationBelongsToTheVisibleRegion) luego agregarAnnotation. –

+0

No existe tal función. –

21

http://developer.apple.com/library/ios/#documentation/MapKit/Reference/MapKitFunctionsReference/Reference/reference.html

MKMapRectContainsPoint le dirá si es visible.

visibleCount = 0; 
for (MyAnnotation *annotation in mapView.annotations) { 
    if (MKMapRectContainsPoint(mapView.visibleMapRect, MKMapPointForCoordinate(annotation.coordinate))) 
    { 
     visibleCount++; 
    } 
} 

Recomiendo hacer este método en un hilo de fondo si tiene muchas anotaciones. pero puede determinar si es visible en el mapa

+0

Gracias por los votos positivos chicos. Me alegra que esto ayude a las personas con sus aplicaciones de mapas. –

+0

Esta respuesta debe ser aceptada como la real. – Camsoft

+2

no, esta NO es la respuesta correcta, se requiere verificar cada anotación en el mapa, ver la respuesta a continuación, y la documentación de las manzanas para las anotaciones Método InMapRect que dice "Este método es mucho más rápido que hacer una búsqueda lineal de los objetos en el las anotaciones te pertenecen a ti mismo. ", annotationsInMapRect usa un árbol para almacenar y buscar puntos. –

36
MKMapRect visibleMapRect = mapView.visibleMapRect; 
NSSet *visibleAnnotations = [mapView annotationsInMapRect:visibleMapRect]; 
+6

esta es la respuesta correcta, mucho más rápido que el método de, es log n en comparación con N. –

Cuestiones relacionadas