12

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

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

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

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

未完成的网格线

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

4

3 回答 3

18

更新: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];
    }
}
于 2013-01-17T00:51:28.767 回答
5

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

mapViewDidFinishRenderingMap:fullyRendered

于 2013-12-13T11:19:58.017 回答
0

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

于 2013-01-22T15:02:25.727 回答