2012-07-30 62 views
7

由于当从缓存中加载切片时不调用- (void)mapViewDidFinishLoadingMap:(MKMapView *)mapView,是否有办法知道所有切片何时加载(无论是从缓存还是从映射服务器)并显示?检测MapView切片的显示时间

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

+2

我已经向苹果错误#13774496涉及到这一点,并创建了一个示例应用程序,以显示这个问题仍然存在于iOS6的:https://github.com/iwasrobbed/MapKitDelegateBug – iwasrobbed 2013-05-01 15:27:52

回答

4

下面是一些源代码,我写道:https://github.com/jonathanlking/mapViewTest

你为什么不想想这样的问题;

当地图视图改变时,mapView:regionDidChangeAnimated:将被调用。

从那里mapViewWillStartLoadingMap:将被调用。

接下来mapViewDidFailLoadingMap:withError:mapViewDidFinishLoadingMap:将被调用,如果瓦片已从服务器获取。

但是,如果两者都不被调用,则可以假定正在从缓存中加载切片。

+2

谢谢,但还是有没有办法知道什么时候显示。 – 2012-08-08 18:47:26

+0

它们在被缓存时即时显示。 – 2012-08-08 18:53:53

+2

对不起,但这不起作用。我删除了iPod Touch上的互联网连接,并放大到没有缓存切片的级别,并且仍然表明地图完成加载成功(从您的示例中的缓存中)。这是苹果方面的一个错误。 – iwasrobbed 2013-05-01 13:11:12

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]; 
    } 
} 
+0

这不适用于您已经失去互联网连接的场景,因此无法加载更多的图块。它仍然呼叫代表说地图已经完全加载。 – iwasrobbed 2013-05-01 13:12:43