2012-07-30 19 views
7

Poiché - (void)mapViewDidFinishLoadingMap:(MKMapView *)mapView non viene chiamato quando le tessere vengono caricate dalla cache, esiste un modo per sapere quando tutte le tessere sono state caricate (dalla cache o dai server di mappatura) e visualizzate?Rilevamento quando vengono visualizzate le tessere MapView

C'è una delega che indica che le tessere sono state caricate?

+2

ho depositato di Apple Bug # 13.774.496 relative a questo e ha creato un esempio app per mostrare il problema esiste ancora in iOS6: https://github.com/iwasrobbed/MapKitDelegateBug – iwasrobbed

risposta

4

Ecco qualche codice sorgente che ho scritto:https://github.com/jonathanlking/mapViewTest

Perché non si pensa al problema come questo;

Quando la vista della mappa cambierà, verrà chiamato mapView:regionDidChangeAnimated:.

Da qui verrà chiamato mapViewWillStartLoadingMap:.

Il prossimo mapViewDidFailLoadingMap:withError: o mapViewDidFinishLoadingMap: verrà chiamato se le tessere sono state recuperate dal server.

Tuttavia, se nessuno dei due viene chiamato, è possibile assumere che le tessere vengano caricate dalla cache.

+2

Grazie, ma non v'è ancora alcun modo per sapere quando sono visualizzati. –

+0

Vengono visualizzati immediatamente, così come sono memorizzati nella cache. –

+2

Siamo spiacenti, ma questo non funziona. Ho rimosso la connessione Internet sul mio iPod Touch e ho eseguito lo zoom su un livello in cui non erano presenti riquadri memorizzati nella cache e indica ancora che il caricamento della mappa è stato completato correttamente (dalla cache nell'esempio). Questo è un bug da parte di Apple. – iwasrobbed

2

Come già accennato, talvolta non viene chiamato il numero mapViewDidFinishLoadingMap, soprattutto se i riquadri della mappa sono già memorizzati nella cache e talvolta vengono chiamati più volte.

Ho notato che quando viene chiamato più volte all'ultima chiamata tutte le tessere sono visualizzate. Quindi penso che puoi farlo funzionare se imposti un timer di 2 secondi dopo che la mappa ha iniziato a cambiare. Disabilitare le interazioni in modo che la mappa non continui a cambiare e abilitare le interazioni dell'utente quando il timer si spegne.

Se mapViewDidFinishLoadingMap viene chiamato, reimpostare nuovamente il timer per 2 secondi nel futuro. Quando il timer si spegne, dovresti avere una mappa completamente renderizzata.

È necessario considerare le altre richiamate come mapViewDidFailLoadingMap. Prova anche questo su una connessione rumorosa, poiché 2 secondi potrebbero non essere abbastanza lunghi se ci vorrà molto tempo per recuperare le tessere.

- (void)restartTimer 
{ 
    [self.finishLoadingTimer invalidate]; 
    self.finishLoadingTimer = [NSTimer scheduledTimerWithTimeInterval:2.0 
                   target:self 
                  selector:@selector(mapLoadingIsFinished) 
                  userInfo:nil 
                   repeats:NO]; 
} 

- (void)mapLoadingIsFinished 
{ 
    self.finishLoadingTimer = nil; 
    self.mapChanging = NO; 
    self.view.userInteractionEnabled = YES; 
} 

- (void)mapViewDidFinishLoadingMap:(MKMapView *)mapView 
{ 
    if (self.mapChanging) { 
     [self restartTimer]; 
    } 
} 

- (void)startLookingForMapChange 
{ 
    assert(self.mapChanging == NO); 
    if (self.mapChanging == NO) { 
     self.mapChanging = YES; 
     assert(self.finishLoadingTimer == nil); 
     self.view.userInteractionEnabled = NO; 
     [self restartTimer]; 
    } 
} 
+0

Questo non funziona per lo scenario in cui hai perso la connessione a Internet in modo che non possa caricare più tessere. Chiama ancora il delegato dicendo che la mappa è stata caricata completamente. – iwasrobbed

Problemi correlati