7

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

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

4

2 回答 2

4

这是我写的一些源代码: https ://github.com/jonathanlking/mapViewTest

你为什么不考虑这样的问题;

当地图视图将发生变化时,mapView:regionDidChangeAnimated:将被调用。

从那里mapViewWillStartLoadingMap:将被调用。

如果已从服务器获取图块,则将调用NextmapViewDidFailLoadingMap:withError:或。mapViewDidFinishLoadingMap:

但是,如果两者都没有被调用,您可以假设切片是从缓存中加载的。

于 2012-08-08T17:52:11.307 回答
2

如前所述,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];
    }
}
于 2013-01-17T18:41:55.907 回答