Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/106.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 能否将当前未显示的uiview转换为uiimage_Ios_Swift_Uiview_Uiimage - Fatal编程技术网

Ios 能否将当前未显示的uiview转换为uiimage

Ios 能否将当前未显示的uiview转换为uiimage,ios,swift,uiview,uiimage,Ios,Swift,Uiview,Uiimage,我已经找到了许多将UIView转换为UIImage的例子,一旦视图布局完成,它们就可以完美地工作。即使在我的视图控制器中有许多行,其中一些行是净的,但仍显示在屏幕上,我也可以进行转换。不幸的是,对于表中较低的一些视图(因此尚未“绘制”),进行转换会生成一个空白的UIImage 我试着调用setNeedsDisplay和LayoutIfNeed,但这些都不起作用。我甚至尝试过在表中自动滚动,但可能我没有(使用线程)确保在转换发生之前先滚动,允许视图更新。我怀疑这是做不到的,因为我发现有各种各样的问

我已经找到了许多将UIView转换为UIImage的例子,一旦视图布局完成,它们就可以完美地工作。即使在我的视图控制器中有许多行,其中一些行是净的,但仍显示在屏幕上,我也可以进行转换。不幸的是,对于表中较低的一些视图(因此尚未“绘制”),进行转换会生成一个空白的UIImage

我试着调用setNeedsDisplay和LayoutIfNeed,但这些都不起作用。我甚至尝试过在表中自动滚动,但可能我没有(使用线程)确保在转换发生之前先滚动,允许视图更新。我怀疑这是做不到的,因为我发现有各种各样的问题在问这个问题,但都没有找到解决办法。或者,我可以在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)
}

您不必在窗口/屏幕上拥有视图,就可以将其渲染为图像。我在以下方面做了这项工作:


如果要在屏幕上渲染视图,则会将视图的层渲染为当前的图像。也就是说,如果视图尚未布局,则其外观将与预期不符。PixelTest通过在验证快照测试视图时预先强制布局视图来实现此目的。

您也可以使用完成此操作e> UIGraphicsImageRenderer

扩展UIView{ func image()->UIImage{ 让imageRenderer=UIGraphicsImageRenderer(边界:边界) 如果let format=imageRenderer.format为?UIGraphicsImageRenderFormat{ format.opaque=true } 让image=imageRenderer.image{context在 返回layer.render(在:context.cgContext中) } 返回图像 } }
你能澄清一下这个目的吗?你不能这么做,它只适用于当前打开(或关闭)渲染的视图屏幕。我想不出任何简单的方法来做到这一点。也许你可以通过编程将桌面从上到下滚动,并在每个单元格出现时逐个创建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
    }

}