更新:iOS7 有一个新的委托可能已经解决了这个问题。我还没有确认一种或另一种方式。
- (void)mapViewDidFinishRenderingMap:(MKMapView *)mapView fullyRendered:(BOOL)fullyRendered
前 iOS6 支持:
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)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];
}
}