如何使用MKMapView完成加载委托,可能“完成显示”委托?

我试图保存一个地图视图的缩略图,当用户点击保存时已经select了注释。 当用户尚未放大该注释时会出现该问题,因此尚未加载closures缩放级别。

这是用户点击保存后我正在做的事情:

  1. 设置一个布尔“保存”为true
  2. 居中并放大注释(无animation)
  3. 当调用mapViewDidFinishLoadingMap委托方法时,如果保存为true:
  4. 从视图中创build一个UIImage,并保存它。 closures模态视图。

然而,当图像被保存,视图被解散,实际上保存的结果图像还没有完成加载,因为我仍然看到一个带网格线的卸载的地图,如下所示:

网格线未完成

我的问题是,我怎么能保证地图完成加载和完成显示之前,我保存这个缩略图?

更新:iOS7有一个新的代表 ,可能已经解决了这个问题。 我还没有确认的方式或其他。

- (void)mapViewDidFinishRenderingMap:(MKMapView *)mapView fullyRendered:(BOOL)fullyRendered 

Pre iOS6支持:

mapViewDidFinishLoadingMap :似乎是不可靠的 。 我注意到它有时根本不会被调用,特别是如果地图切片已经被caching了,有时会被多次调用。

我注意到,当它被多次调用时,最后一次调用将正确呈现。 所以我认为如果你在用户点击保存之后设置了一个2秒的定时器,你可以得到这个工作。 禁用交互以使其他事情不会发生,并在计时器启动时启用用户交互。

如果mapViewDidFinishLoadingMap被调用,将来重置定时器2秒。 当计时器最终熄灭时,得到地图的快照,它应该是正确的。

你也会想要考虑其他的callback,比如mapViewDidFailLoadingMap 。 还要在嘈杂的连接上进行testing,因为如果花费很长时间来获取拼贴,2秒可能不够长。

 - (void)restartTimer { [self.finishLoadingTimer invalidate]; self.finishLoadingTimer = [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(mapLoadingIsFinished) userInfo:nil repeats:NO]; } - (void)userClickedSave { assert(self.saving == NO); if (self.saving == NO) { self.saving = YES; assert(self.finishLoadingTimer == nil); self.view.userInteractionEnabled = NO; [self restartTimer]; } } - (void)mapLoadingIsFinished { self.finishLoadingTimer = nil; [self doSnapshotSequence]; self.saving = NO; self.view.userInteractionEnabled = YES; } - (void)mapViewDidFinishLoadingMap:(MKMapView *)mapView { if (self.saving) { [self restartTimer]; } } 

如果为iOS7开发最好的代理使用:mapViewDidFinishRenderingMap:fullyRendered:

mapViewDidFinishRenderingMap:fullyRendered

您确定您正在使用屏幕截图的区域是否支持您正在应用的缩放级别。 例如,在美国的缩放级别支持较高,可以放大到最大的细节,而在亚洲可能是一个高的缩放级别可能不被支持。