拍摄 AGSMapView 的快照

Taking snapshot of AGSMapView

使用以下代码拍摄 AGSMapView 的快照

此代码将设置 kEAGLDrawablePropertyRetainedBacking 属性,它需要否则它将拍摄白色快照。

let layer =  self.AgsMapView.layer as! CAEAGLLayer
        layer.drawableProperties = [
            kEAGLDrawablePropertyRetainedBacking: NSNumber(int: 1),                                      kEAGLDrawablePropertyColorFormat: kEAGLColorFormatRGBA8]

拍摄快照的代码

func snapshotForEAGLView() -> UIImage {

        //glFlush()
        var width: GLint = 0, height: GLint = 0
        let scale: CGFloat = UIScreen.mainScreen().scale
        let prevGLContext = EAGLContext.currentContext()
glGetRenderbufferParameteriv(GLenum(GL_RENDERBUFFER), GLenum(GL_RENDERBUFFER_WIDTH), &width)
        glGetRenderbufferParameteriv(GLenum(GL_RENDERBUFFER), GLenum(GL_RENDERBUFFER_HEIGHT), &height)

        let dataLength = width * height * 4
        let imageBytes = UnsafeMutablePointer<GLubyte>.alloc(Int(dataLength))

        glPixelStorei(GLenum(GL_PACK_ALIGNMENT), 4)

        glReadPixels(0, 0, GLsizei(width), GLsizei(height), GLenum(GL_RGBA), GLenum(GL_UNSIGNED_BYTE), imageBytes)

        let dataProvider = CGDataProviderCreateWithData(nil, imageBytes, Int(dataLength), nil)

        EAGLContext.setCurrentContext(prevGLContext)

        let colorSpace = CGColorSpaceCreateDeviceRGB()
        if let imageRef = CGImageCreate(Int(width), Int(height), 8, 32, Int(width) * 4, colorSpace, [CGBitmapInfo.ByteOrder32Big, CGBitmapInfo(rawValue: CGImageAlphaInfo.PremultipliedLast.rawValue)], dataProvider, nil, true, CGColorRenderingIntent.RenderingIntentDefault) {
            return UIImage(CGImage: imageRef, scale: scale, orientation: .DownMirrored)
        }
        return UIImage()
    }

在应用程序中,我们在两个控制器上有 AGSMapView,比如说 Controller1Controller2,点击 Controller1 上的按钮,Controller2 被按下.

我们正在 Controller2 上截取屏幕截图,但有时它会从 Controller1

截取 AGSMapView 的屏幕截图

它是随机发生的,我们有什么方法可以提供截屏的视图或任何其他方法来避免这种情况。

非常感谢任何帮助。

drawViewHierarchyInRect

辛苦了,谢谢大家

    let size = CGSizeMake(viewWidth, viewHeight)

    UIGraphicsBeginImageContextWithOptions(size, false, UIScreen.mainScreen().scale)

    let rec = CGRectMake(0, 0, viewWidth, viewHeight)
    self.agsMapView.drawViewHierarchyInRect(rec, afterScreenUpdates: true)

    let image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return image;