Ios 能否将当前未显示的uiview转换为uiimage
我已经找到了许多将UIView转换为UIImage的例子,一旦视图布局完成,它们就可以完美地工作。即使在我的视图控制器中有许多行,其中一些行是净的,但仍显示在屏幕上,我也可以进行转换。不幸的是,对于表中较低的一些视图(因此尚未“绘制”),进行转换会生成一个空白的UIImage 我试着调用setNeedsDisplay和LayoutIfNeed,但这些都不起作用。我甚至尝试过在表中自动滚动,但可能我没有(使用线程)确保在转换发生之前先滚动,允许视图更新。我怀疑这是做不到的,因为我发现有各种各样的问题在问这个问题,但都没有找到解决办法。或者,我可以在UIImage中重新绘制整个视图,而不需要UIView吗 来自Paul Hudson的网站 使用屏幕上未显示的任何UIView(例如,UITableview中位于屏幕底部下方的一行)Ios 能否将当前未显示的uiview转换为uiimage,ios,swift,uiview,uiimage,Ios,Swift,Uiview,Uiimage,我已经找到了许多将UIView转换为UIImage的例子,一旦视图布局完成,它们就可以完美地工作。即使在我的视图控制器中有许多行,其中一些行是净的,但仍显示在屏幕上,我也可以进行转换。不幸的是,对于表中较低的一些视图(因此尚未“绘制”),进行转换会生成一个空白的UIImage 我试着调用setNeedsDisplay和LayoutIfNeed,但这些都不起作用。我甚至尝试过在表中自动滚动,但可能我没有(使用线程)确保在转换发生之前先滚动,允许视图更新。我怀疑这是做不到的,因为我发现有各种各样的问
let renderer = UIGraphicsImageRenderer(size: view.bounds.size)
let image = renderer.image { ctx in
view.drawHierarchy(in: view.bounds, afterScreenUpdates: true)
}
您不必在窗口/屏幕上拥有视图,就可以将其渲染为图像。我在以下方面做了这项工作:
如果要在屏幕上渲染视图,则会将视图的层渲染为当前的图像。也就是说,如果视图尚未布局,则其外观将与预期不符。PixelTest通过在验证快照测试视图时预先强制布局视图来实现此目的。您也可以使用
你能澄清一下这个目的吗?你不能这么做,它只适用于当前打开(或关闭)渲染的视图屏幕。我想不出任何简单的方法来做到这一点。也许你可以通过编程将桌面从上到下滚动,并在每个单元格出现时逐个创建UIImage。它感觉有点黑客味,但它可以工作。我的应用程序的可能副本有多行(比如6到10行)上有很多图表的TableView。我想从应用程序中取出这些内容与其他人共享。拍摄快照很好,但速度慢且繁琐。对于某些应用程序,我还想裁剪快照,使其仅包含屏幕快照的相关部分,即感兴趣的uiview。因此,我创建了一个共享按钮,并希望一次将所有6或10个视图转储到共享中(发送电子邮件、空投或添加到照片库),但它只会为屏幕上没有的视图提供空白。我不相信。它是有效的!非常感谢。你知道这个网站上至少有五个这样的问题尚未解决,即没有提供解决方案。你是个天才。这个方法使用我的xib默认高度和宽度生成UIImage。如何使其使用自定义维度创建快照?谢谢。这也可以,但现在背景为白色,而在上述方法中,我可以选择不透明为真(并获得黑色背景)。您可以使用
格式(uigraphicsimagerendereformat
)UIGraphicsImageRenderer
的属性更改不透明值。谢谢。工作正常。如何标记两个答案正确。此方法对其生成的UIImage使用我的xib的默认高度和宽度。如何使其对快照使用自定义尺寸?您可以更改方法签名并传递边界参数:function图像(customDimensions:CGRect=bounds)
extension UIView {
/// Creates an image from the view's contents, using its layer.
///
/// - Returns: An image, or nil if an image couldn't be created.
func image() -> UIImage? {
UIGraphicsBeginImageContextWithOptions(bounds.size, false, 0)
guard let context = UIGraphicsGetCurrentContext() else { return nil }
context.saveGState()
layer.render(in: context)
context.restoreGState()
guard let image = UIGraphicsGetImageFromCurrentImageContext() else { return nil }
UIGraphicsEndImageContext()
return image
}
}