检测何时显示MapView切片

时间:2012-07-30 19:23:26

标签: iphone ios mkmapview mkmapviewdelegate

由于从缓存加载切片时未调用- (void)mapViewDidFinishLoadingMap:(MKMapView *)mapView,是否有办法知道何时加载了所有切片(从缓存或映射服务器加载)并显示?

是否有任何代表团暗示已加载了瓷砖?

2 个答案:

答案 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];
    }
}