Wie erwähnt, wird mapViewDidFinishLoadingMap
manchmal überhaupt nicht aufgerufen, besonders wenn die Kartenkacheln bereits zwischengespeichert sind, und manchmal wird es mehrmals aufgerufen.
Ich merke, dass wenn es beim letzten Aufruf mehrfach aufgerufen wird, alle Kacheln gerendert werden. Ich denke, Sie können das zum Laufen bringen, wenn Sie einen 2-Sekunden-Timer einrichten, nachdem sich die Karte geändert hat. Deaktivieren Sie Interaktionen, damit sich die Zuordnung nicht ändert, und aktivieren Sie Benutzerinteraktionen, wenn der Zeitgeber deaktiviert wird.
Wenn mapViewDidFinishLoadingMap
aufgerufen wird, setzen Sie den Timer erneut für 2 Sekunden in die Zukunft. Wenn der Timer schließlich ausgeschaltet wird, sollten Sie eine vollständig gerenderte Karte haben.
Sie sollten die anderen Rückrufe wie mapViewDidFailLoadingMap
berücksichtigen. Testen Sie dies auch bei einer verrauschten Verbindung, da 2 Sekunden möglicherweise nicht lang genug sind, wenn es lange dauert, die Kacheln zu holen.
- (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];
}
}
Ich habe eingereicht Apple-Bug # 13.774.496 im Zusammenhang mit diesem und erstellt ein Beispiel-App des Problem weiterhin auf iOS6 existiert zeigen: https://github.com/iwasrobbed/MapKitDelegateBug – iwasrobbed