アップデート:iOS7にはnew delegateがあり、この問題が修正されている可能性があります。私はどちらか一方の方法をまだ確認していません。
- (void)mapViewDidFinishRenderingMap:(MKMapView *)mapView fullyRendered:(BOOL)fullyRendered
前iOS6のサポート:
mapViewDidFinishLoadingMap
:unreliableように見えます。私は時には地図のタイルがすでにキャッシュされていて、それが複数回呼び出されることがある場合は、まったく呼び出されないことに気付きます。
私は、複数回呼び出されたときに最後の呼び出しが正しくレンダリングされることに気付きました。だから私はあなたが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];
}
}
私はこれに関連したアップルのバグ#13774496を提出し、問題がまだiOS6に存在を示すためにサンプルアプリを作成しました:https:// github。com/iwasrobbed/MapKitDelegateBug – iwasrobbed