Swift - snapshotView 功能不适用于大型 UIView
Posted
技术标签:
【中文标题】Swift - snapshotView 功能不适用于大型 UIView【英文标题】:Swift - snapshotView function is not working for large UIViews 【发布时间】:2020-07-02 08:01:17 【问题描述】:我正在为 iPad(第 7 代)创建示例应用程序。
在那里我可以获得A2
大小的 UIView 的快照。但它不适用于A1
大小的 UiView。
A2 -> UIView(frame: CGRect(x: 0, y: 0, width: 2182, height: 3086))
A1 -> UIView(frame: CGRect(x: 0, y: 0, width: 3086, height: 4370))
我逐渐降低了 A1 的高度(即 4370 点),当高度低于 4096 点时它开始工作。
我查看了苹果文档,但找不到任何线索。谁能解释为什么? ????
import UIKit
class ViewController: UIViewController
let page = UIView(frame: CGRect(x: 0, y: 0, width: 2182, height: 3086)) // this is working (A2 page size)
//let page = UIView(frame: CGRect(x: 0, y: 0, width: 3086, height: 4370)) // this is not working (A1 page size)
let pagePreviewContainer = UIView()
override func viewDidLoad()
super.viewDidLoad()
page.backgroundColor = .yellow
self.view.addSubview(page)
let someSubView = UIView(frame: CGRect(x: 10, y: 10, width: 25, height: 25))
someSubView.backgroundColor = .red
page.addSubview(someSubView)
pagePreviewContainer.translatesAutoresizingMaskIntoConstraints = false
pagePreviewContainer.layer.borderColor = UIColor.blue.cgColor
pagePreviewContainer.layer.borderWidth = 1
view.addSubview(pagePreviewContainer)
NSLayoutConstraint.activate([
pagePreviewContainer.widthAnchor.constraint(equalToConstant: 400),
pagePreviewContainer.heightAnchor.constraint(equalToConstant: 400),
pagePreviewContainer.centerXAnchor.constraint(equalTo: view.centerXAnchor),
pagePreviewContainer.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: -100)
])
override func viewDidLayoutSubviews()
super.viewDidLayoutSubviews()
let previewOfPage = self.page.snapshotView(afterScreenUpdates: true)
pagePreviewContainer.addSubview(previewOfPage!)
self.view.layoutIfNeeded()
【问题讨论】:
【参考方案1】:您达到 4096 的限制我并不感到惊讶,因为它是 2 的幂,并且图形系统中的纹理始终以 2 的幂的大小存储。由于iPad是@2x设备,所以图片的高度其实是8192。
我没有确切的答案,因为我从未尝试过,但我有几个建议。
您可以使用 CoreGraphics 并将视图的图层绘制到图像上下文中。除了更改您的快照调用之外,这基本上不需要任何更改。
如果这仍然不起作用,您可能需要考虑使用 CoreGraphics“手动”渲染视图上的内容。
您还可以以尽可能高的分辨率进行渲染,然后放大图像,如果差别不大,可能不会被注意到。
【讨论】:
@EmilionPelaez 据此,似乎核心图形也无法正常工作***.com/questions/42904135/…【参考方案2】:由于 iPad 是@2x 设备,而第 7 代 iPad 的高度分辨率为 2048px,它们根本无法捕获大于 2x2048 = 4096 的视图,因此它是一个页面预览,因此请尝试调整输出图像的大小并制作它适合预览容器。
【讨论】:
输出图像是什么意思?我没有使用任何核心图形来生成快照图像。实际上使用核心图形没问题,但缺乏 snapshotView(afterScreenUpdates:) 的性能,所以对我的目的没有用:)以上是关于Swift - snapshotView 功能不适用于大型 UIView的主要内容,如果未能解决你的问题,请参考以下文章
snapshotView AfterScreenUpdates 创建一个空白图像