【发布时间】:2019-07-08 12:24:41
【问题描述】:
我发现了许多将 UIView 转换为 UIImage 的示例,一旦视图布局等,它们就可以完美地工作。即使在我的视图控制器中有很多行,其中一些还没有显示在屏幕上,我也可以进行转换。不幸的是,对于一些在表格中太靠后的视图(因此还没有被“绘制”),进行转换会产生一个空白的 UIImage。
我尝试调用 setNeedsDisplay 和 layoutIfNeeded,但这些都不起作用。我什至尝试过自动滚动表格,但也许我没有以确保滚动首先发生的方式(使用线程)在转换发生之前允许视图更新。我怀疑这无法完成,因为我发现了各种各样的问题,但都没有找到解决方案。或者,我是否可以只在 UIImage 中重绘整个视图,而不需要 UIView?
来自 Paul Hudson 的网站
使用任何未在屏幕上显示的 UIView(比如 UITableview 中位于屏幕底部下方的一行。
let renderer = UIGraphicsImageRenderer(size: view.bounds.size)
let image = renderer.image { ctx in
view.drawHierarchy(in: view.bounds, afterScreenUpdates: true)
}
【问题讨论】:
-
你能澄清一下这样做的目的吗?
-
你不能这样做,它只适用于当前呈现在(或关闭)屏幕上的视图。我想不出任何简单的方法来做到这一点。也许您可以以编程方式从上到下滚动表格,并在每个单元格出现时一个一个地创建 UIImage。感觉很hacky,但它可以工作。
-
我的应用程序有表格视图,其中包含多行上的大量图表(例如 6 到 10 行)。我想把这些从应用程序中拿出来与他人分享。拍摄快照很好,但速度慢且麻烦。对于某些应用程序,我还想裁剪快照以仅包含屏幕截图的相关部分,即感兴趣的 uiview。因此,我创建了一个共享按钮,并希望一次将所有 6 或 10 个视图转储到共享中(发送到电子邮件、空投或添加到照片库),但它只会为那些不在屏幕上的视图提供空白。