快照缩放的 UIView

Snapshot scaled UIView

使用 UIGraphicsGetImageFromCurrentImageContext() 和各种其他方法(包括 render(in:)drawHierarchy(in: afterScreenUpdates:) 函数对 UIView 进行快照在需要呈现常规 ol' 视图时效果很好.

在尝试绘制按比例缩放的 UIView 层次结构时,我一直无法正常工作。有问题的视图是 UIScrollView 的内容和缩放视图。

视图及其父视图拒绝在快照之前执行任何可以解决缩放问题的转换。结果是快照看起来像:

TL;DR:尽管尝试转换 UIView 并按 UIScrollView 缩放后无法对其进行快照/渲染或在快照前重绘。

编辑:请参阅下面的示例,了解这种令人沮丧的行为。

  1. 快照视图的结果(实际结果
  2. 预期结果(无法使用 CoreGraphics 重现)

要绘制滚动视图的完整内容视图,您可以使用类似的东西:

@IBAction func onClear(_ sender: Any) {
    self.targetImageView.image = nil
}

@IBAction func onSnapshot(_ sender: Any) {
    UIGraphicsBeginImageContextWithOptions(self.contentView.bounds.size, false, UIScreen.main.scale)
    if let context = UIGraphicsGetCurrentContext() {
        self.contentView.layer.render(in: context)
        let image = UIGraphicsGetImageFromCurrentImageContext()
        self.targetImageView.image = image
    } else {
        self.targetImageView.image = nil
    }
    UIGraphicsEndImageContext()
}

测试

在上部区域有一个启用缩放的滚动视图(maximumZoomScale = 5)。在下方区域只有一个简单的 UIImageView。如果点击带有标签 "snap" 的按钮,则会调用 onSnapshot 并且下方的 UIImageView 会填充快照图像。使用按钮 'clear' UIImageView 的图像设置为 nil。