2012-11-23 11 views
7

Sto sviluppando un'applicazione in cui voglio mostrare aerei immaginari che volano da e per gli aeroporti. Questa potrebbe non essere l'unica cosa che voglio rappresentare volare attraverso la mappa.Spostamento MKOverlayPathView scompare dietro le tessere

Per questo ho utilizzato il codice di esempio da LocationReminders (la sottoclasse MKOverlayPathView che hanno, ReminderCircleView) e lo ho collegato a un MKOverlay del mio rappresentante l'aereo. Questa classe si abbona per le notifiche KVO sulle proprietà di coordinate e raggi della classe di overlay e invalida il suo percorso ogni volta che c'è un aggiornamento.

L'overlay aggiorna la sua posizione a diversi fotogrammi al secondo e aggiorno anche il suo raggio in modo da poter simulare la prospettiva (non molto intelligente considerando che si tratta di un oggetto modello ma è comunque la soluzione migliore che ho trovato).

Sto utilizzando un percorso circolare semplice per il test.

Questa configurazione funziona correttamente. La vista di sovrapposizione viene aggiornata e si comporta correttamente, ridimensionando insieme alla mappa e tutto.

Il problema è che in un volo simulato l'overlay non verrà disegnato su alcune tessere, normalmente vicino alla destinazione. Sembra che il cerchio stia andando dietro a queste tessere.

Sono stato in grado di capire una cosa in questo problema: ogni volta che osservo il cerchio che non viene disegnato su alcune tessere se faccio lo zoom indietro il cerchio verrà disegnato correttamente. Lo zoom in o panning non risolve comunque nulla.

La mia teoria è che alcune delle tessere (o le loro mappe) non vengono contrassegnate per il ridisegno e quindi, solo ingrandendo posso forzare. Tuttavia, ritengo che non sia coerente con il fatto che lo zoom non sembra essere d'aiuto.

Non so se sto facendo qualcosa di sbagliato o se sto sbattendo contro un errore o qualcosa del genere. Ho usato invece le annotazioni e stava funzionando, ma con ciò ho perso la capacità di rappresentare un piano che si rimpicciolisce se si rimpicciolisce senza osservare me stesso la scala dello zoom.

Ho provato nelle versioni 5.1, 6.0 e 6.1 e il comportamento è lo stesso.

risposta

2

Ho capito cosa stava causando quel comportamento.

Sul mio MKOverlay Stavo cambiando il boundingMapRect per abbinare la posizione dell'aereo ad ogni aggiornamento di posizione. In realtà MKMapView chiede solo il MKOverlay all'inizio (ho avuto modo di sapere questo controllando le chiamate a -(BOOL)intersectsMapRect:(MKMapRect)mapRect).

Come test ho modificato il boundingMapRect in modo che corrisponda al mondo intero (boundingMapRect = MKMapRectWorld;) e ha funzionato. Quindi era solo questione di creare un MKMapRect attorno al percorso del mio aereo e basta.

Bene, Apple afferma quanto segue per quanto riguarda boundingMapRect:

Il rettangolo proiettata che comprende la sovrapposizione. (obbligatorio) (sola lettura) Questa proprietà contiene il rettangolo più piccolo che comprende completamente l'area di sovrapposizione. Gli implementatori di questo protocollo devono impostare quest'area quando implementano la loro classe di overlay. Il rettangolo dovrebbe essere specificato usando le coordinate proiettate, cioè le coordinate ottenute proiettando il globo su una superficie bidimensionale.

E direi qualcosa come:

Il rettangolo proiettata che comprende la sovrapposizione. (obbligatorio) (sola lettura) Questa proprietà contiene il rettangolo più piccolo che comprende completamente l'area che l'overlay può essere presentato in. Gli implementatori di questo protocollo devono impostare quest'area quando implementano la loro classe di overlay. Il rettangolo dovrebbe essere specificato usando le coordinate proiettate, cioè le coordinate ottenute proiettando il globo su una superficie bidimensionale.