はタイルがキャッシュから読み込まれたときに呼び出されないため- (void)mapViewDidFinishLoadingMap:(MKMapView *)mapView
、すべてのタイルがいつ (キャッシュまたはマッピング サーバーから) 読み込まれて表示されたかを知る方法はありますか?
タイルが読み込まれたことを知らせる委任はありますか?
はタイルがキャッシュから読み込まれたときに呼び出されないため- (void)mapViewDidFinishLoadingMap:(MKMapView *)mapView
、すべてのタイルがいつ (キャッシュまたはマッピング サーバーから) 読み込まれて表示されたかを知る方法はありますか?
タイルが読み込まれたことを知らせる委任はありますか?
ここに私が書いたソースコードがあります: https://github.com/jonathanlking/mapViewTest
この問題について、次のように考えてみませんか。
マップ ビューが変更mapView:regionDidChangeAnimated:
されると、 が呼び出されます。
そこからmapViewWillStartLoadingMap:
呼ばれます。
NextmapViewDidFailLoadingMap:withError:
またはmapViewDidFinishLoadingMap:
タイルがサーバーから取得された場合に呼び出されます。
ただし、どちらも呼び出されない場合は、タイルがキャッシュから読み込まれていると見なすことができます。
前述のように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)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];
}
}