在后台加载 MKMapView 并从中创建 UIImage (iPhone & iPad)
Posted
技术标签:
【中文标题】在后台加载 MKMapView 并从中创建 UIImage (iPhone & iPad)【英文标题】:Load MKMapView in background and create UIImage from it (iPhone & iPad) 【发布时间】:2012-05-14 14:14:22 【问题描述】:我有一种情况,我需要一种方法来加载具有多个叠加层的 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];
注意:应用等待地图完全加载(以便正确创建图像)非常重要。
【问题讨论】:
【参考方案1】:这可能有帮助,也可能没有帮助,但这是我在我的情况下所做的。
我有一个包含 7 个表格单元格的场地/企业的表格视图。其中一个表格单元包含一个带有 pindrop 的地图。当用户第一次查看设施时,我会运行一个快速条件来查看地图视图是否已被缓存(或者更确切地说,保存为图像)。如果图像不存在,我将一个新的地图视图加载到单元格中并添加一个 pindrop 注释。在地图视图都加载并且注释已删除后,我将视图层保存到图像,然后从单元格中删除地图视图(并释放它,因为我们需要保持代理活动)并替换为新的图像。我建议生成一个后台线程以将图像/插入保存到单元格中。这样表格视图就不会阻塞。
最后,当用户下次返回同一个场所/商家时,地图视图图像存在并且我加载图像。
我知道完全加载地图很重要,否则您的图像会在地图未加载的地方显示为灰色。如果您要放置图钉,则需要确保在地图完成加载 (mapViewDidFinishLoadingMap:) 和注释已删除 (mapView:didAddAnnotationViews:) 后触发图像保存方法。只有在两者都完成后,您才能触发保存图像的方法。我建议使用延迟选择器。我延迟了 1 秒。
同样的概念当然可以应用于其他情况。底线是,正如 strings42 所述,您必须在视图中添加可见的地图视图才能捕获图像。
【讨论】:
延迟是缺失的部分。即使在调用 didFinishLoadingMap 方法之后,我仍然看到灰色图像,直到我添加了延迟。谢谢!【参考方案2】:您应该能够在MKMapViewDelegate
协议中实现mapViewDidFinishLoadingMap
并将您的图像存储在那里,我想。这应该可以解决需要等到地图加载后才能存储图像的问题。
如果您还发现了其他问题,请提供有关这些问题的更多详细信息,因为您的问题不清楚您要询问的具体问题。
【讨论】:
我已经尝试过实现这个委托方法,但是它似乎从来没有被调用过,因为我从不显示包含地图视图的视图。 啊,是的。你是对的,如果不显示 mapView,你几乎肯定无法获得实际的地图图像,因为这是触发它去获取数据的原因。此外,我提出这一点只是因为 *** 社区几乎肯定会用回复来淹没你,如果我不这样做,那么将 MKMapView 数据用于除实际显示之外的任何内容可能违反了 Google 的服务条款一张地图。 IANAL,我没有连接到谷歌,只是提到它。无论如何,MKMapView 并不能真正用作不可见的数据源。 啊,我明白了,谢谢。我没有意识到这是一个问题 - 我假设可以拍摄地图并通过电子邮件发送。感谢您的澄清。 您可以在视图控制器的视图下方插入地图视图。这样,地图视图本身就不会被看到,但由于它被添加到视图层次结构中,委托方法将被触发。【参考方案3】:下面的方法会一直作为mapView的代理调用,
mapViewDidFinishRenderingMap:fullyRendered:
所以,你可以在这里从 mapView 获取地图图像
- (UIImage *)renderToImage:(MKMapView *)mapView
UIGraphicsBeginImageContext(mapView.bounds.size);
[mapView.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return image;
【讨论】:
以上是关于在后台加载 MKMapView 并从中创建 UIImage (iPhone & iPad)的主要内容,如果未能解决你的问题,请参考以下文章
iOS:每次用户加载应用程序时如何刷新 MKMapView 用户位置