快照缩放的 UIView
Snapshot scaled UIView
使用 UIGraphicsGetImageFromCurrentImageContext()
和各种其他方法(包括 render(in:)
和 drawHierarchy(in: afterScreenUpdates:)
函数对 UIView
进行快照在需要呈现常规 ol' 视图时效果很好.
在尝试绘制按比例缩放的 UIView
层次结构时,我一直无法正常工作。有问题的视图是 UIScrollView
的内容和缩放视图。
视图及其父视图拒绝在快照之前执行任何可以解决缩放问题的转换。结果是快照看起来像:
- A) 一个不幸的裁剪视图,其原点在左上角(如 iOS 所预期的那样),但随后仅扩展到视图的未转换 "bounds"。如果视图碰巧没有缩放或比例变换,这没关系,但这种情况很少发生。
- B) 带有黑色大边框的超大视图与转换后的视图 "frame" 相匹配。我假设发生这种情况是因为拍摄缩放视图的框架时有些奇怪。
TL;DR:尽管尝试转换 UIView
并按 UIScrollView
缩放后无法对其进行快照/渲染或在快照前重绘。
编辑:请参阅下面的示例,了解这种令人沮丧的行为。
- 快照视图的结果(实际结果)
- 预期结果(无法使用 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。
使用 UIGraphicsGetImageFromCurrentImageContext()
和各种其他方法(包括 render(in:)
和 drawHierarchy(in: afterScreenUpdates:)
函数对 UIView
进行快照在需要呈现常规 ol' 视图时效果很好.
在尝试绘制按比例缩放的 UIView
层次结构时,我一直无法正常工作。有问题的视图是 UIScrollView
的内容和缩放视图。
视图及其父视图拒绝在快照之前执行任何可以解决缩放问题的转换。结果是快照看起来像:
- A) 一个不幸的裁剪视图,其原点在左上角(如 iOS 所预期的那样),但随后仅扩展到视图的未转换 "bounds"。如果视图碰巧没有缩放或比例变换,这没关系,但这种情况很少发生。
- B) 带有黑色大边框的超大视图与转换后的视图 "frame" 相匹配。我假设发生这种情况是因为拍摄缩放视图的框架时有些奇怪。
TL;DR:尽管尝试转换 UIView
并按 UIScrollView
缩放后无法对其进行快照/渲染或在快照前重绘。
编辑:请参阅下面的示例,了解这种令人沮丧的行为。
- 快照视图的结果(实际结果)
- 预期结果(无法使用 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。