4

我有一种情况,我需要一种加载具有多个叠加层的 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];

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

4

3 回答 3

1

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

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

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

我知道完全加载地图很重要,否则您的图像会在地图未加载的地方以灰色保存。如果您要放置图钉放置,则需要确保在地图完成加载 (mapViewDidFinishLoadingMap:) 和注释已删除 (mapView:didAddAnnotationViews:) 后触发图像保存方法。只有在两者都完成后,您才能触发保存图像的方法。我建议使用延迟选择器。我将其延迟 1 秒。

同样的概念肯定可以应用于其他情况。底线是,正如 strings42 所述,您将不得不在视图中添加可见的地图视图才能捕获图像。

于 2012-05-19T20:53:52.930 回答
0

我想你应该能够mapViewDidFinishLoadingMapMKMapViewDelegate协议中实现并将你的图像存储在那里。那应该解决需要等到地图加载才能存储图像的问题。

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

于 2012-05-14T17:16:15.740 回答
0

下面的方法将始终作为 mapView 的委托调用,

mapViewDidFinishRenderingMap:fullyRendered:

所以,你可以在这里从 mapView 获取地图图像

- (UIImage *)renderToImage:(MKMapView *)mapView
{
  UIGraphicsBeginImageContext(mapView.bounds.size);
  [mapView.layer renderInContext:UIGraphicsGetCurrentContext()];
  UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
  UIGraphicsEndImageContext();
  return image;
}
于 2013-12-24T14:53:43.017 回答