由于- (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];
}
}