由于当从缓存中加载切片时不调用- (void)mapViewDidFinishLoadingMap:(MKMapView *)mapView
,是否有办法知道所有切片何时加载(无论是从缓存还是从映射服务器)并显示?检测MapView切片的显示时间
是否有任何代表团暗示瓷砖已加载?
由于当从缓存中加载切片时不调用- (void)mapViewDidFinishLoadingMap:(MKMapView *)mapView
,是否有办法知道所有切片何时加载(无论是从缓存还是从映射服务器)并显示?检测MapView切片的显示时间
是否有任何代表团暗示瓷砖已加载?
下面是一些源代码,我写道:https://github.com/jonathanlking/mapViewTest
你为什么不想想这样的问题;
当地图视图改变时,mapView:regionDidChangeAnimated:
将被调用。
从那里mapViewWillStartLoadingMap:
将被调用。
接下来mapViewDidFailLoadingMap:withError:
或mapViewDidFinishLoadingMap:
将被调用,如果瓦片已从服务器获取。
但是,如果两者都不被调用,则可以假定正在从缓存中加载切片。
谢谢,但还是有没有办法知道什么时候显示。 – 2012-08-08 18:47:26
它们在被缓存时即时显示。 – 2012-08-08 18:53:53
对不起,但这不起作用。我删除了iPod Touch上的互联网连接,并放大到没有缓存切片的级别,并且仍然表明地图完成加载成功(从您的示例中的缓存中)。这是苹果方面的一个错误。 – iwasrobbed 2013-05-01 13:11:12
如前所述,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];
}
}
这不适用于您已经失去互联网连接的场景,因此无法加载更多的图块。它仍然呼叫代表说地图已经完全加载。 – iwasrobbed 2013-05-01 13:12:43
我已经向苹果错误#13774496涉及到这一点,并创建了一个示例应用程序,以显示这个问题仍然存在于iOS6的:https://github.com/iwasrobbed/MapKitDelegateBug – iwasrobbed 2013-05-01 15:27:52