由于从缓存加载切片时未调用- (void)mapViewDidFinishLoadingMap:(MKMapView *)mapView
,是否有办法知道何时加载了所有切片(从缓存或映射服务器加载)并显示?
是否有任何代表团暗示已加载了瓷砖?
答案 0 :(得分:4)
以下是我写的一些源代码: https://github.com/jonathanlking/mapViewTest
你为什么不考虑这样的问题;
当地图视图发生变化时,将调用mapView:regionDidChangeAnimated:
。
将从那里调用mapViewWillStartLoadingMap:
。
如果已从服务器提取切片,则会调用下一个mapViewDidFailLoadingMap:withError:
或mapViewDidFinishLoadingMap:
。
但是,如果两者都没有被调用,则可以假设从缓存中加载了区块。
答案 1 :(得分:2)
如上所述,有时根本不会调用mapViewDidFinishLoadingMap
,尤其是如果地图图块已经被缓存,有时会被多次调用。
我注意到,在最后一次调用时多次调用它时,所有的tile都会被渲染。因此,如果您在地图开始更改后设置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];
}
}