Я хочу отобразить CIImage в GLKView.GLKView находится в содержании представления (суперпредставление).Я хочу, чтобы GLKView рендерил изображение как аспект-заливку.Я хочу, чтобы GLKView занимал все пространство содержащего UIView.
Но что бы я ни делал, это не так.Результат можно увидеть на следующем изображении.Содержащий вид имеет красный фон, чтобы его было легко увидеть.Вверху у нас есть панель навигации, а внизу панель инструментов с серыми значками.
Я просто понятия не имею, почему 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, и хотя я, очевидно, получаю некоторые разные результаты, все они оказываются в одном и том же месте и никогда не заполняют супер-представление.
Есть идеи?