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

问题描述:

我有一种情况,我需要一种加载MKMapView的方式与几个覆盖。此地图视图不应显示在屏幕上,我需要它加载的唯一原因是为了从地图创建图像以供其他地方使用。在后台加载MKMapView,并从它创建UIImage(iPhone和iPad)

我已经在网上看了一下,但我没有找到解决问题的运气。请有人帮助我吗?

这是我到目前为止已经试过(没有成功)

// Load the map view 
Logs_Map_ViewController *mapViewController = [[Map_ViewController alloc] initWithNibName:@"Map_ViewController" bundle:nil]; 
mapViewController.GPSCoordinatesToPlot = [someDictionary objectForKey:kGPSCoords]; 

// Take a picture of the map 
UIImage *mapImage = [mapViewController convertMapToImage]; 
NSData *imageData = [NSData dataWithData:UIImagePNGRepresentation(mapImage)]; 
NSString *base64String = [imageData base64EncodedString]; 

注:这是非常重要的应用程序等待地图完全负载(从而正确创建图像)。

您应该能够在MKMapViewDelegate协议中实施mapViewDidFinishLoadingMap并将您的图像存储在那里,我想。这应该解决需要等待地图加载以存储图像的问题。

如果您也看到其他问题,请提供更多关于这些问题的详细信息,因为您的问题并不清楚您询问的具体问题。

+0

我曾尝试实施这一委托的方法,但它从来没有显示过包含mapview的视图。 –

+0

啊,是的。你是对的,你几乎肯定不能在不显示mapView的情况下得到实际的地图图像,因为这是触发它获取数据的原因。另外,我只是提出这个问题,因为*社区几乎肯定会让你回应,如果我不这样做,那可能是违反了Google的服务条款,将MKMapView数据用于除了实际显示以外的任何内容一张地图。 IANAL,我没有联系到Google,只是提到它。无论如何,MKMapView并不能真正用作不可见的数据源。 – strings42

+0

啊,我明白了,谢谢。我没有意识到这是一个问题 - 我假定拍摄地图并发送电子邮件是可以的。感谢您的澄清。 –

这可能会也可能不会有帮助,但这是我在我的情况下做的。

我有一个场景/业务与7个表格单元格的桌面视图。其中一个表格单元格包含一个带有pindrop的地图。当用户第一次查看企业时,我运行一个快速条件查看mapview是否已被缓存(或者更确切地说,保存为图像)。如果图像不存在,我将一个新的mapview加载到单元格中并添加一个单一的pindrop注释。在mapview已经加载并且注解已经被删除之后,我将视图图层保存为图像,然后从单元中删除mapview(并释放它,因为我们需要保持代表活着),并用新的新图像替换。我建议spawing一个后台线程来保存图像/插入单元格。这种方式表格视图不会窒息。

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

我知道这对地图完全加载非常重要,否则在未加载地图的情况下,图像会以灰色保存。如果您放弃了放针,则需要确保在地图加载完成后(mapViewDidFinishLoadingMap :)并且您的注记已经放下(mapView:didAddAnnotationViews :)),图像保存方法才会触发。只有在两者都完成后,您才能开始保存图像。我建议使用延迟选择器。我延迟了1秒。

这个相同的概念肯定可以应用于其他情况。底线是,因为strings42状态,你将不得不添加一个可见的地图视图到你的视图来捕捉图像。

+0

延期是失踪的一块。即使在didFinishLoadingMap方法被调用之后,我仍然看到一个灰色的图像,直到我添加了延迟。谢谢! – jmstone617

+0

也为我工作。我不喜欢它。但它的工作。 – roocell

的方法,下面将始终被称为MapView类的代表,

mapViewDidFinishRenderingMap:fullyRendered: 

所以,你可以从MapView的地图图像这里

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