无法正确应用仿射变换将子图像绘制到UIView的上下文中

时间:2017-10-10 11:01:14

标签: ios uiview cgcontext cgaffinetransform cgimage

我正在实现UIView的子类,我动态调用它drawRect(_:)。只能为更新的rect调用drawRect(_:)。在视图画布中,我将绘图应用到相同大小的屏幕外图像缓冲区中,在drawRect(_:)内,我提取更新后的子图像并绘制到当前上下文中。

我无法解决的问题是子图像被翻转绘制。我知道这是正常的,因为UIView的原点位于左上角,而裁剪的子图像的原点位于左下角。

当我使用以下代码在绘图之前翻转子图像时,不会发生绘图。如果我删除箭头所示的线条,我会看到更新后的子图像被翻转。你能告诉我我的仿射变换有什么问题吗?

override func draw(_ rect: CGRect) {
    guard let _ = bufferImage else { return }

    let scaleFactor = UIScreen.main.scale
    let scaledRect = rect.applying(CGAffineTransform(scaleX: scaleFactor, y: scaleFactor))
    let croppedImage = bufferImage!.cgImage!.cropping(to: scaledRect)!
    let context = UIGraphicsGetCurrentContext()!
    context.scaleBy(x: 1.0, y: -1.0)                // <------
    context.translateBy(x: 0.0, y: -rect.height)    // <------
    context.draw(croppedImage, in: rect)
}

0 个答案:

没有答案