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

red*_*ft5 12 objective-c mapkit ios

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

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

  1. 将bool"save"设置为true
  2. 居中并放大注释(无动画)
  3. 调用mapViewDidFinishLoadingMap委托方法时,如果save为true:
  4. 从视图中创建UIImage并保存.关闭模态视图.

但是,当保存图像并且视图被取消时,实际保存的结果图像实际上还没有完成加载,因为我仍然看到带有网格线的卸载地图,如下所示:

网格线未完成

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

Sko*_*tch 18

更新:iOS7有一个新的委托可能已修复此问题.我还没有证实这种或那种方式.

- (void)mapViewDidFinishRenderingMap:(MKMapView *)mapView fullyRendered:(BOOL)fullyRendered 
Run Code Online (Sandbox Code Playgroud)

预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];
    }
}
Run Code Online (Sandbox Code Playgroud)


y0g*_*007 5

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

mapViewDidFinishRenderingMap:fullyRendered