Como se mencionó, mapViewDidFinishLoadingMap
a veces no se llama en absoluto, especialmente si las teselas del mapa ya están en la memoria caché, y algunas veces se llama varias veces.
Me di cuenta de que cuando se llama varias veces en la última llamada se procesan todas las teselas. Así que creo que puede hacer que esto funcione si configura un temporizador de 2 segundos después de que el mapa comience a cambiar. Desactive las interacciones para que el mapa no continúe cambiando y habilite las interacciones del usuario cuando el temporizador se apaga.
Si se llama a mapViewDidFinishLoadingMap
reinicie el temporizador de nuevo durante 2 segundos en el futuro. Cuando el temporizador finalmente se apaga, debes tener un mapa completamente renderizado.
Querrá considerar las otras devoluciones de llamada como mapViewDidFailLoadingMap
. Pruebe también esto en una conexión ruidosa, ya que 2 segundos pueden no ser lo suficientemente largos si lleva mucho tiempo recuperar las fichas.
- (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];
}
}
he presentado de Apple Bug # 13774496 relacionado con este y ha creado una aplicación ejemplo para demostrar el problema todavía existe en iOS6: https://github.com/iwasrobbed/MapKitDelegateBug – iwasrobbed