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

时间:2012-10-19 03:51:07

标签: objective-c ios mapkit

当用户在选择注释时点击保存时,我正在尝试保存mapview的缩略图。当用户尚未放大该注释时,会出现此问题,因此尚未加载关闭缩放级别。

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

  1. 将bool“save”设为true
  2. 居中并放大注释(无动画)
  3. 调用mapViewDidFinishLoadingMap委托方法时,如果保存为true:
  4. 从视图中创建UIImage并保存。关闭模态视图。
  5. 然而,当图像被保存并且视图被取消时,实际保存的结果图像实际上还没有完成加载,因为我仍然看到带有网格线的卸载地图,如下所示:

    Gridlines unfinished

    我的问题是,在保存此缩略图之前,如何确保地图已完成加载并完成显示?

3 个答案:

答案 0 :(得分:17)

更新:iOS7有new delegate可能已解决此问题。我还没有证实这种或那种方式。

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

Pre iOS6支持:

mapViewDidFinishLoadingMap:似乎是unreliable。我注意到它有时根本不被调用,特别是如果地图图块已经被缓存,有时它被多次调用。

我注意到,当它被多次调用时,最后一次调用将正确呈现。因此,如果您在用户点击保存后设置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];
    }
}

答案 1 :(得分:5)

如果为iOS7开发,最好使用的委托是:mapViewDidFinishRenderingMap:fullyRendered:

mapViewDidFinishRenderingMap:fullyRendered

答案 2 :(得分:0)

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