2010-07-22 12 views
8

hay una manera de actualizar (es decir, moverse) un MKOverlay que ya está agregado al MKMapView. Eliminar un antiguo y agregar uno nuevo es terrible (lento).mover/actualizar MKOverlay en MKMapView

es decir, me gustaría disparar la función de fondo que se llama a esta función cuando una superposición de movimientos en la pantalla:

- (MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id <MKOverlay>)overlay 

(con MKAnnotions es un poco mejor, creo, pero no puedo utilizar MKPolyline, MKPolygon , etc. y toda la información se reduce a un solo punto)

+0

Además: para darle una impresión donde necesito esta función: utilizo un MapView y coloco Anotaciones encima para mostrar las posiciones de los satélites. Cada satélite también debe mostrar una huella (el área donde se puede "ver" el satélite sobre el horizonte). Esta información (la posición y la forma de la huella) debe actualizarse periódicamente. En el Momento tengo una solución con una Vista para todas las Huellas donde dibujo con CoreGraphics las formas correctas. Pero preferiría una Solución con MKOverlay, pero no puedo hacer que sean dinámicas ... ¿Alguna idea? – user398877

Respuesta

4

MKOverlayView tiene los siguientes métodos que obligan MapKit que volver a hacer el mapRect dado:

- (void)setNeedsDisplayInMapRect:(MKMapRect)mapRect

- (void)setNeedsDisplayInMapRect:(MKMapRect)mapRect zoomScale:(MKZoomScale)zoomScale

Si está utilizando un contador de tiempo (o petición HTTP periódica o algún tipo de otro método para determinar que su superposición debe ser actualizada), llamando a uno de los métodos anteriores en la OverlayView causará volver a renderizar ese punto en el mapa (es decir, -canDrawMapRect:zoomScale: se volverá a llamar y se llamará a -drawMapRect:zoomScale:inContext: si el primero devuelve SÍ).


Actualización:

Si no está seguro de lo que mapRect que necesita para volver a hacer, usted podría poder utilizar el MKMapRectWorld constante como el mapRect - que creo que haría que la superposición en todo el mapa para volver a cargar (una vez visible).

+1

Me parece que ... a partir de iOS 7, estos métodos están en 'MKOverlayRenderer', no' MKOverlayView'. – livingtech

+0

Si desea actualizar todo el mapa, puede simplemente llamar a 'setNeedsDisplay ' – gcamp

0

De hecho tuve que forzar la vista de superposición para invalidar la ruta, borrar la ruta anterior antes de configurar una nueva. [polygonView invalidatePath]. Decir a la vista del mapa que necesita una actualización de pantalla no fue suficiente para mí.

1

Use MKAnnotations. Puede cambiar la coordenada de ellos. Simplemente desactive cualquier elemento relacionado con el tacto. Necesitarías tu propio código de dibujo para dibujar las anotaciones, OpenGL probablemente lo solucionaría. Nadie sabría la diferencia.

+3

Las vistas de anotación permanecen del mismo tamaño si realiza un zoom, los tamaños de superposición son relativos a la escala de zoom ¿no?Necesito especificar un círculo en el mapa que debe marcar un área específica (tal vez un parque o algo así). – yuf

0

Esto parece obligar al mapa a actualizar las superposiciones. Probablemente anotaciones también.

[self.mapView setCenterCoordinate: self.mapView.centerCoordinate];