在适用于 iOS 的 Google 地图 SDK 上进行 GMSMapView 屏幕截图时出现问题

2024-04-29

我遇到的一个问题是当我尝试截取 GMSMapView(Google Maps SDK iOS)任何部分的屏幕截图时。 UIGraphicsGetImageFromCurrentImageContext() UIImage 输出是不可见的。我最终发现GMSMapView是用OpenGL渲染的。知道这一点后,我尝试使用 glReadPixels() 方法。令人不安的是,我能够在 iPhone 模拟器上很好地检索地图屏幕截图,但当我在真实设备上使用相同的方法时,它仍然不可见(iOS 6)。

我想知道是否有人遇到过同样的问题?我已经完成了我的调查工作。我找不到任何与我的情况相关的内容。我找到的大多数通用解决方案都表示我应该更新一些 CAEAGLLayer 属性。我认为 GMSMapView 会限制我找到适当的图层,但我能够找到并更新 CAEAGLLayer,如下所示:

[(CAEAGLLayer *)[[[mapView_ subviews] objectAtIndex:0] layer] setOpaque: NO];

[(CAEAGLLayer *)[[[mapView_ subviews] objectAtIndex:0] layer] setDrawableProperties:[NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithBool:YES],kEAGLDrawablePropertyRetainedBacking,kEAGLColorFormatRGBA8, kEAGLDrawablePropertyColorFormat,nil]];

论坛建议通过将图层的 OPAQUE 属性设置为 NO,并将保留的支持属性设置为 YES,这样可以缓解 iOS 6 的问题。它确实修复了模拟器上的问题,但没有修复设备上的问题。

我偶然发现的最后一个修复是将主 OpenGL 视图的 keepBackBuffer 更新为 YES。我的技术专长到此结束。我无法找到在哪里或如何更新 GMSMapView 的 keepBackBuffer 值。我假设这个修复可以解决我所有的屏幕捕获问题。似乎仅是运行 iOS 6+ 的设备的问题。

有人针对此问题有经过测试的解决方法吗?


在 Google Maps for iOS v1.1 中,有 GMSScreenshot 类可以实现此目的。

    UIImage* image = [GMSScreenshot screenshotOfMainScreen];

不过,这已在 v1.2 中删除,因为现在可以使用标准图形上下文方法捕获地图图层。假设 GMSMapView 是 'self' 的子视图:

- (UIImage *)captureScreen {
    UIGraphicsBeginImageContextWithOptions(self.frame.size, YES, 0.0f);
    [self.layer renderInContext:UIGraphicsGetCurrentContext()];

    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    return image;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在适用于 iOS 的 Google 地图 SDK 上进行 GMSMapView 屏幕截图时出现问题 的相关文章

随机推荐