在后台加载MKMapView并从中创建UIImage(iPhone和iPad)

在后台加载MKMapView并从中创建UIImage(iPhone和iPad),iphone,ipad,uiimage,mkmapview,Iphone,Ipad,Uiimage,Mkmapview,我有一种情况,我需要一种加载带有多个覆盖的MKMapView的方法。此地图视图不应显示在屏幕上,我要求加载它的唯一原因是为了从地图中创建一个图像供其他地方使用 我在网上浏览了一下,但没有找到解决问题的方法。有人能帮我吗 以下是我迄今为止所做的尝试(没有成功) 注意:应用程序等待地图完全加载(以便正确创建图像)非常重要。我认为,您应该能够在MKMapViewDelegate协议中实现mapviewdidfishloadingmap,并将图像存储在那里。这将解决需要等待地图加载后才能存储图像的问题

我有一种情况,我需要一种加载带有多个覆盖的MKMapView的方法。此地图视图不应显示在屏幕上,我要求加载它的唯一原因是为了从地图中创建一个图像供其他地方使用

我在网上浏览了一下,但没有找到解决问题的方法。有人能帮我吗

以下是我迄今为止所做的尝试(没有成功)


注意:应用程序等待地图完全加载(以便正确创建图像)非常重要。

我认为,您应该能够在
MKMapViewDelegate
协议中实现
mapviewdidfishloadingmap
,并将图像存储在那里。这将解决需要等待地图加载后才能存储图像的问题


如果您还看到其他问题,请提供更多详细信息,因为您的问题不清楚您要问的具体问题。

这可能有用,也可能没有帮助,但这是我在我的情况下所做的

我有一个带有7个桌面单元的场地/企业的桌面视图。其中一个表格单元格包含带有pindrop的映射。当用户第一次查看一个机构时,我运行一个快速条件,查看mapview是否已被缓存(或者更确切地说,保存为图像)。如果图像不存在,我会将一个新的mapview加载到单元格中,并添加一个pindrop注释。加载mapview和删除注释后,我将视图层保存到图像,然后从单元格中删除mapview(并释放它,因为我们需要保持代理活动),并替换为新图像。我建议使用一个背景线程来保存图像/插入单元格。这样,表视图就不会阻塞

最后,当用户下次返回同一地点/业务时,mapview图像将存在,我将加载该图像

我知道完全加载地图很重要,否则图像会在地图未加载的地方以灰色保存。如果要删除插针放置,则需要确保在地图完成加载(mapViewDidFinishLoadingMap:)和注释删除(mapView:didAddAnnotationViews:)后启动图像保存方法。只有在两者都完成后,才应启动方法来保存图像。我建议使用延迟选择器。我把它延迟了一秒钟


同样的概念当然也适用于其他情况。底线是,正如strings42所述,为了捕获图像,您必须在视图中添加一个可见的mapview。

以下方法将始终作为mapview的代理调用

mapViewDidFinishRenderingMap:fullyRendered:
所以,您可以在这里从mapView获取地图图像

- (UIImage *)renderToImage:(MKMapView *)mapView
{
  UIGraphicsBeginImageContext(mapView.bounds.size);
  [mapView.layer renderInContext:UIGraphicsGetCurrentContext()];
  UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
  UIGraphicsEndImageContext();
  return image;
}

我已经尝试实现这个委托方法,但是它似乎从未被调用,因为我从未显示包含mapview的视图。啊,是的。没错,如果不显示mapView,几乎肯定无法获取实际的地图图像,因为这就是触发它获取数据的原因。此外,我之所以提出这个问题,是因为StackOverflow社区几乎肯定会向您提供最新的信息,如果我不这样做,那么使用MKMapView数据进行实际显示地图以外的任何事情都可能违反谷歌的服务条款。伊纳尔,我和谷歌没有联系,只是提一下而已。无论如何,MKMapView并不能真正用作不可见的数据源。啊,我明白了,谢谢。我没有意识到这是一个问题——我假设拍一张地图并通过电子邮件发送是可以的。感谢您的澄清。您可以在视图控制器的视图下插入地图视图。这样,地图视图本身就永远看不到,但由于它被添加到视图层次结构中,委托方法将被激发。延迟是缺少的部分。即使在调用didFinishLoadingMap方法之后,我仍然看到一个灰色图像,直到我添加了延迟。谢谢
- (UIImage *)renderToImage:(MKMapView *)mapView
{
  UIGraphicsBeginImageContext(mapView.bounds.size);
  [mapView.layer renderInContext:UIGraphicsGetCurrentContext()];
  UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
  UIGraphicsEndImageContext();
  return image;
}