7

我正在努力解决的一个问题是,当我尝试截取 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 视图的 preserveBackBuffer 更新为 YES。这就是我的技术专长结束的地方。我无法找到更新 GMSMapView 的 preserveBackBuffer 值的位置或方式。我假设这是可以解决我所有屏幕捕获问题的修复程序。似乎只是运行 iOS 6+ 的设备的问题。

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

4

2 回答 2

6

在 Google Maps for iOS v1.1 中,有 GMSScreenshot 类可以实现这一点。

    UIImage* image = [GMSScreenshot screenshotOfMainScreen];

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

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

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

    return image;
}
于 2013-04-24T08:10:34.007 回答
0

我在 Google 地图组上打开了一个问题,用于 GMSMapView 的屏幕截图。他们说

我相信在 1.1.0 版本中,现在可以使用GMSScreenshot screenshotOfMainScreen

于 2013-02-25T10:17:26.640 回答