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];
}
}
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