我有一种情况,我需要一种方法来加载带有多个叠加层的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];
注意:应用程序等待地图完全加载非常重要(以便正确创建图像)。
答案 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;
}