在Google Maps SDK for iOS上拍摄GMSMapView的屏幕截图

Cha*_*urn 5 cocoa google-maps opengl-es ios google-maps-sdk-ios

我正在努力解决的一个问题是当我尝试对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]];
Run Code Online (Sandbox Code Playgroud)

论坛建议通过将图层的OPAQUE属性设置为NO并将保留的后台属性设置为YES来缓解iOS 6问题.它确实在模拟器上修复了它,但没有修复它.

我偶然发现的最后一个修复程序是将主OpenGL视图的preserveBackBuffer更新为YES.这是我的技术专长结束的地方.我无法找到更新GMSMapView的preserveBackBuffer值的位置或方法.我假设这是解决我的所有屏幕捕获问题的修复程序.似乎只是运行iOS 6+的设备的问题.

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

小智 6

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

    UIImage* image = [GMSScreenshot screenshotOfMainScreen];
Run Code Online (Sandbox Code Playgroud)

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

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

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

    return image;
}
Run Code Online (Sandbox Code Playgroud)