2010-07-22 15 views
8

c'è un modo per aggiornare (ovvero spostarsi) uno MKOverlay già aggiunto allo MKMapView. Rimozione di uno vecchio e l'aggiunta di uno nuovo è terribile (lento).spostamento/aggiornamento di MKOverlay su MKMapView

cioè vorrei innescare la funzione di background che chiama questa funzione quando una sovrapposizione si sposta sullo schermo:

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

(con MKAnnotions la sua un po 'meglio credo, ma non posso usare MKPolyline, MKPolygon , ecc e tutta l'informazione viene ridotto ad un unico punto)

+0

aggiunta: per darvi un'impressione dove ho bisogno di questa funzione: io uso un MapView e posto annotazioni su di esso per mostrare le posizioni dei satelliti. Ogni satellite dovrebbe anche mostrare un'impronta (l'area in cui è possibile "vedere" il satellite sopra l'orizzonte). Queste informazioni (la posizione e la forma dell'impronta) devono essere aggiornate periodicamente. Nel momento in cui ho una soluzione con una vista vor tutte le impronte in cui disegno con CoreGraphics le forme giuste. Ma preferirei una soluzione con MKOverlay, ma non riesco a renderli dinamici ... qualche idea? – user398877

risposta

4

MKOverlayView ha i seguenti metodi che costringono MapKit ri-rendere il mapRect proposta:

- (void)setNeedsDisplayInMapRect:(MKMapRect)mapRect

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

Se stai usando un timer (o richiesta HTTP periodica o una sorta di altro metodo per determinare che la sovrapposizione dovrebbe essere aggiornato), chiamando uno dei metodi di cui sopra sul OverlayView causerà per ri-rendere quel punto sulla mappa (es -canDrawMapRect:zoomScale: verrà richiamato e verrà chiamato -drawMapRect:zoomScale:inContext: se il primo restituisce SÌ).


Aggiornamento:

Se non siete sicuri di quello che mapRect è necessario ri-renderizzare, si potrebbe essere in grado di utilizzare la costante MKMapRectWorld come mapRect - che credo potrebbe causare la sovrapposizione attraverso l'intera mappa per ricaricare (una volta visibile).

+1

A me sembra che ... come in iOS 7, questi metodi siano in 'MKOverlayRenderer', non in' MKOverlayView'. – livingtech

+0

Se si desidera aggiornare l'intera mappa, è sufficiente chiamare 'setNeedsDisplay ' – gcamp

0

In realtà ho dovuto forzare la vista di sovrapposizione per invalidare il percorso, per cancellare il vecchio percorso prima di configurarne uno nuovo. [polygonView invalidatePath]. Dire alla vista della mappa che ha bisogno di un aggiornamento del display era insufficiente per me.

1

Utilizzare MKAnnotations. Puoi cambiare le loro coordinate. Basta disabilitare qualsiasi materiale relativo al tocco. Avresti bisogno del tuo codice di disegno per disegnare le annotazioni, OpenGL probabilmente farebbe il trucco. Nessuno saprebbe la differenza.

+3

AnnotationViews rimangono della stessa dimensione se si esegue lo zoom, le dimensioni di sovrapposizione sono relative alla scala dello zoom, giusto?Devo specificare un cerchio sulla mappa che dovrebbe contrassegnare un'area specifica (forse un parco o qualcosa del genere). – yuf

0

Questo sembra forzare la mappa per aggiornare gli overlay. Probabilmente anche annotazioni.

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

Problemi correlati