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

时间:2012-05-14 14:14:23

标签: iphone ipad uiimage mkmapview

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

我在网上看了一下,但我没有找到解决问题的办法。请有人帮帮我吗?

这是我迄今为止尝试过的(没有成功)

// 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];

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

3 个答案:

答案 0 :(得分:1)

这可能有用也可能没用,但这就是我在我的情况下做的事情。

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

最后,下次用户返回同一场地/业务时,地图视图图像存在,我加载图像。

我知道地图完全加载非常重要,否则您的图片会以地图未加载的灰色保存。如果您正在丢弃引脚丢弃,则需要确保在映射完成加载(mapViewDidFinishLoadingMap :)并且您的注释已删除(mapView:didAddAnnotationViews :)之后,图像保存方法将触发。只有在两者完成后才应该开火方法来保存图像。我建议使用延迟选择器。我推迟了1秒钟。

同样的概念肯定可以应用于其他情况。底线是,正如字符串42所述,您必须在视图中添加可见的地图视图才能捕获图像。

答案 1 :(得分:0)

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

如果您还看到其他问题,请提供有关这些问题的详细信息,因为您的问题不清楚您所询问的具体问题。

答案 2 :(得分:0)

以下方法将始终作为mapView的委托,

调用
mapViewDidFinishRenderingMap:fullyRendered:

所以,您可以从mapView这里获取地图图片

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