Ios 快照缩放UIView

Ios 快照缩放UIView,ios,swift,uiview,uiscrollview,rendering,Ios,Swift,Uiview,Uiscrollview,Rendering,使用UIGraphicsGetImageFromCurrentImageContext()和多种其他方法(包括render(in:)和drawHierarchy(in:AfterCreenUpdate:)函数)对UIView进行快照在需要渲染常规ol'视图时效果非常好 在尝试绘制缩放的ui视图层次结构时,我无法使任何这些正常工作。所讨论的视图是UIScrollView的内容和缩放视图 视图及其超级视图拒绝在快照之前进行任何转换,以解决缩放问题。结果是快照的外观如下所示: A) 一个不幸被裁剪的

使用
UIGraphicsGetImageFromCurrentImageContext()
和多种其他方法(包括
render(in:)
drawHierarchy(in:AfterCreenUpdate:)
函数)对
UIView进行快照在需要渲染常规ol'视图时效果非常好

在尝试绘制缩放的
ui视图
层次结构时,我无法使任何这些正常工作。所讨论的视图是
UIScrollView
的内容和缩放视图

视图及其超级视图拒绝在快照之前进行任何转换,以解决缩放问题。结果是快照的外观如下所示:

  • A) 一个不幸被裁剪的视图,其原点位于左上角(正如在iOS上所预期的那样),但随后仅扩展到视图的未转换“边界”。如果视图碰巧没有缩放或缩放变换,这是可以的,但这种情况很少发生
  • B) 一个超大的视图,带有与视图的变换“框架”匹配的黑色大边框。我假设这是由于对缩放视图的帧进行快照时出现了一些奇怪的情况
TL;DR:在被
UIScrollView
缩放和缩放后,无法对
UIView
进行快照/渲染,尽管尝试在快照之前进行变换或重画

编辑:有关这种令人沮丧的行为的示例,请参见下文

  • 快照视图的结果(实际结果
  • 预期结果(无法使用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将填充快照图像。通过“清除”按钮,UIImageView的图像设置为零


    谢谢!这并不是我想要解决的问题,尽管它朝着正确的方向发展,而且很有帮助。。。问题是,当我尝试快照滚动视图的整个内容时,内容被缩放(如右图所示),有趣的事情发生了,我无法获得内容的完整呈现(如左图所示)。我已经更新了答案。现在,滚动视图的内容视图已快照。我还添加了一个清除操作,以确保删除快照映像。然后在演示中,我放大并移动该区域并拍摄快照。内容视图显示正确。这就是你想要实现的吗?这正是我想要实现的,而你的代码/解决方案正是我所期望的。但出于某种原因,我仍然看到上面的结果(请参见对我的问题的编辑)更新:您的解决方案效果很好,正如预期的那样,我只需要调整边界的大小并乘以变换值,然后将
    不透明
    剪贴簿
    标志设置为
    !!