ios - 快照缩放的 UIView

标签 ios swift uiview uiscrollview rendering

快照 UIView 使用 UIGraphicsGetImageFromCurrentImageContext() 和各种其他方法,包括 render(in:)drawHierarchy( in: afterScreenUpdates:) 当您需要呈现常规 ol' View 时,函数非常有用。

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

View 和它的父 View 拒绝在快照之前做任何可以解决缩放问题的转换。结果是快照看起来像:

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

TL;DR:在通过 UIScrollView 缩放和缩放后,无法快照/呈现 UIView,尽管尝试在快照之前转换或重绘。

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

  1. 快照 View 的结果(实际结果)UIView Snapshot Result
  2. 预期结果(无法使用 CoreGraphics 重现)Expected result

最佳答案

要绘制 ScrollView 的完整内容 View ,您可以使用类似的东西:

@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()
}

测试

在上部区域有一个带有激活缩放的 ScrollView (maximumZoomScale = 5)。在下方区域只有一个简单的 UIImageView。如果点击标签为“snap”的按钮,onSnapshot 将被调用,下方的 UIImageView 将填充快照图像。使用“清除”按钮,UIImageView 的图像设置为 nil。

snapshot demo

关于ios - 快照缩放的 UIView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57365990/

相关文章:

ios - NSPredicate如何过滤对象字段

ios - Xcode 8 GM 种子 Storyboard布局问题

swift - Steam 通过日期参数

swift - IBOutlet pageControl 无效

ios - 当 superview 布置 subview 时,UISearchBar 动画到位。如何禁用?

ios - MKPolygon 初始化错误 "Missing argument for parameter ' interiorPolygons' in call"/"Extra argument in call"

ios - UIView 动画使 UICollectionView 委托(delegate)变得模糊 - Swift

ios - 使用 MVC 设计模式在 Storyboard 中正确使用 IBOutlets

ios - 在 UIView 上应用渐变未获得预期结果

iphone - 在加载之前用 View 覆盖模态视图