GLKView не заполняет содержащий представление - PullRequest
0 голосов
/ 12 октября 2018

Я хочу отобразить CIImage в GLKView.GLKView находится в содержании представления (суперпредставление).Я хочу, чтобы GLKView рендерил изображение как аспект-заливку.Я хочу, чтобы GLKView занимал все пространство содержащего UIView.

Но что бы я ни делал, это не так.Результат можно увидеть на следующем изображении.Содержащий вид имеет красный фон, чтобы его было легко увидеть.Вверху у нас есть панель навигации, а внизу панель инструментов с серыми значками.

enter image description here

Я просто понятия не имею, почему GLKView не заполняет все содержащиеся в нем представления.

Это кодGLRenderer, который делает это

class GLImageRenderer {
    private var glContext: EAGLContext
    private var videoDisplayViewBounds: CGRect
    private var videoDisplayView: GLKView
    private var scale: CGFloat
    private var renderContext: CIContext

    init(superView: UIView) {
        superView.backgroundColor = UIColor.red
        glContext = EAGLContext(api: EAGLRenderingAPI.openGLES2)!
        videoDisplayView = GLKView(frame: superView.frame, context: glContext)
        videoDisplayView.contentScaleFactor = UIScreen.main.scale
        videoDisplayView.contentMode = .scaleAspectFill
        videoDisplayView.frame = superView.frame
        videoDisplayView.transform = CGAffineTransform.init(rotationAngle: CGFloat.pi/2)

        superView.addSubview(videoDisplayView)
        superView.sendSubviewToBack(videoDisplayView)

        renderContext = CIContext(eaglContext: videoDisplayView.context)

        videoDisplayView.bindDrawable()
        videoDisplayViewBounds = CGRect(x: 0,
                                        y: 0,
                                        width: videoDisplayView.drawableWidth,
                                        height: videoDisplayView.drawableHeight)

        scale = UIScreen.main.scale
    }

    func draw(ciimage: CIImage) {
        let drawFrame = ciimage.extent

        let imageAspectRatio = drawFrame.width / drawFrame.height
        let viewAspectRatio = videoDisplayViewBounds.width / videoDisplayViewBounds.height


        var newDrawFrame: CGRect
        if imageAspectRatio > viewAspectRatio {
            newDrawFrame = CGRect(x: drawFrame.minX + ((drawFrame.width - drawFrame.height * viewAspectRatio) / scale),
                                  y: drawFrame.minY,
                                  width: drawFrame.height * viewAspectRatio,
                                  height: drawFrame.height)
        } else {
            newDrawFrame = CGRect(x: drawFrame.minX,
                                  y: drawFrame.minY + ((drawFrame.height - drawFrame.width / viewAspectRatio) / scale),
                                  width: drawFrame.width,
                                  height: drawFrame.width / viewAspectRatio)
        }

        videoDisplayView.bindDrawable()
        if videoDisplayView.context != EAGLContext.current() {
            EAGLContext.setCurrent(videoDisplayView.context)
        }

        glClearColor(0.5, 0.5, 0.5, 1.0)
        glClear(GLbitfield(GL_COLOR_BUFFER_BIT))
        glEnable(GLenum(GL_BLEND))
        glBlendFunc(GLenum(GL_ONE), GLenum(GL_ONE_MINUS_SRC_ALPHA))

        renderContext.draw(ciimage, in:videoDisplayViewBounds, from: newDrawFrame)
        videoDisplayView.display()
    }

    func close() {
        videoDisplayView.removeFromSuperview()
    }
}

Как можно видеть, я установил режим содержимого GLKView как аспект-заливка, и кадр GLKView установлен так, чтобы соответствовать супер-представлению, но все же это не таксовпадать при рендеринге.Я также пробовал разные комбинации аргументов CGRect с методом рисования ciimage, и хотя я, очевидно, получаю некоторые разные результаты, все они оказываются в одном и том же месте и никогда не заполняют супер-представление.

Есть идеи?

...