【问题标题】:Snapshot scaled UIView快照缩放 UIView
【发布时间】:2019-12-13 09:55:57
【问题描述】:

当您需要渲染常规视图时,使用 UIGraphicsGetImageFromCurrentImageContext() 和各种其他方法(包括 render(in:)drawHierarchy(in: afterScreenUpdates:) 函数)对 UIView 进行快照非常有用。

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

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

  • A) 一个不幸的裁剪视图,其原点位于左上角(正如在 iOS 上所预期的那样),但随后仅扩展到未转换的视图“边界”。如果视图碰巧没有缩放或缩放变换,这没关系,但这种情况很少发生。
  • B) 带有黑色大边框的超大视图,与转换后的视图“框架”相匹配。我假设发生这种情况是因为对缩放视图的框架进行快照时有些奇怪。

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

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

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

【问题讨论】:

    标签: ios swift uiview uiscrollview rendering


    【解决方案1】:

    要绘制滚动视图的完整内容视图,您可以使用以下内容:

    @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 的图像设置为零。

    【讨论】:

    • 谢谢!这不是我想要解决的完全问题,尽管它正朝着正确的方向前进并且很有帮助......问题是当我尝试拍摄整个 滚动视图的内容和内容被缩放(如右图所示),有趣的事情发生了,我无法获得内容的完整呈现(如左图所示)。
    • 我已经更新了答案。现在滚动视图的内容视图被快照了。我还添加了一个明确的操作,以确保删除快照图像。然后在演示中,我放大并移动该区域并拍摄快照。内容视图显示正确。这是你想要达到的目标吗?
    • 这正是我想要实现的目标,而您的代码/解决方案正是我所期望的。但由于某种原因,我仍然看到上面的结果(请参阅我的问题的编辑)
    • 更新:您的解决方案效果很好,正如预期的那样,我只需要调整边界的大小并乘以变换值,然后将 opaqueclipsToBounds 标志设置为 false! !
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-03
    • 1970-01-01
    相关资源
    最近更新 更多