更新: iOS7 には、この問題を修正した可能性のある新しいデリゲートがあります。私はまだどちらかの方法で確認していません。
- (void)mapViewDidFinishRenderingMap:(MKMapView *)mapView fullyRendered:(BOOL)fullyRendered
iOS6 以前のサポート:
mapViewDidFinishLoadingMap
:信頼性がないようです。特にマップ タイルが既にキャッシュされている場合は、まったく呼び出されないこともあれば、複数回呼び出されることもあります。
複数回呼び出されると、最後の呼び出しが正しくレンダリングされることに気付きました。したがって、ユーザーが保存をタップした後に2秒のタイマーを設定すると、これが機能すると思います。他に何も起こらないようにインタラクションを無効にし、タイマーが切れたらユーザーインタラクションを有効にします。
呼び出された場合mapViewDidFinishLoadingMap
は、タイマーを 2 秒後に再度リセットします。タイマーが最終的に切れたら、マップのスナップショットを取得してください。正しいはずです。
などの他のコールバックも検討する必要がありますmapViewDidFailLoadingMap
。また、ノイズの多い接続でこれをテストします。タイルの取得に時間がかかる場合は 2 秒では不十分な場合があるためです。
- (void)restartTimer
{
[self.finishLoadingTimer invalidate];
self.finishLoadingTimer = [NSTimer scheduledTimerWithTimeInterval:2.0
target:self
selector:@selector(mapLoadingIsFinished)
userInfo:nil
repeats:NO];
}
- (void)userClickedSave
{
assert(self.saving == NO);
if (self.saving == NO) {
self.saving = YES;
assert(self.finishLoadingTimer == nil);
self.view.userInteractionEnabled = NO;
[self restartTimer];
}
}
- (void)mapLoadingIsFinished
{
self.finishLoadingTimer = nil;
[self doSnapshotSequence];
self.saving = NO;
self.view.userInteractionEnabled = YES;
}
- (void)mapViewDidFinishLoadingMap:(MKMapView *)mapView
{
if (self.saving) {
[self restartTimer];
}
}