ios - UIView不可见时截图

标签 ios swift uikit

我有一个 UIView,可以像手指画应用程序一样绘制,但有时它不可见。我希望能够在它不可见时截取它的屏幕截图。另外,我想要一个可见的屏幕截图,但我不想要任何 subview 。我只想要 UIView 本身。这是我尝试过的方法:

func shapshot() -> UIImage? {
    UIGraphicsBeginImageContext(self.frame.size)
    guard let context = UIGraphicsGetCurrentContext() else {
        return nil
    }
    self.layer.render(in: context)
    let image = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
    if image == nil {
        return nil
    }

    return image
}

func snapshot() -> UIImage {
    UIGraphicsBeginImageContextWithOptions(bounds.size, self.isOpaque, UIScreen.main.scale)
    layer.render(in: UIGraphicsGetCurrentContext()!)
    let image = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
    return image!
}

最佳答案

要将 View 呈现为 UIImage,您可以引入一个非常简单的协议(protocol)并用它扩展 UIView

protocol Renderable {
    var render: UIImage { get }
}

extension UIView: Renderable {
    var render: UIImage {
        UIGraphicsImageRenderer(bounds: bounds).image { context in
            layer.render(in: context.cgContext)
        }
    }
}

现在获取任何 View 的图像非常容易

let image: UIImage = someView.render

然后,如果您打算共享或保存它,您可能需要将其转换为数据

let data: Data? = image.pngData()

我不确定“当它不可见时”是什么意思,但只要 View 位于 View 层次结构中并且布局正确,这应该可以工作。我已经在许多应用程序中使用这种方法来共享内容,而且它从未让我失望过。

当然,不需要协议(protocol),可以随意使用 render 计算属性。这只是一个偏好问题。


文档: UIGraphicsImageRenderer , image(actions:)

关于ios - UIView不可见时截图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65475264/

相关文章:

ios - 在 WkWebView/mobile Safari 的页面中为 iframe 启用 session cookie

iphone - 在 UIButton 实例中发送额外参数

Swift 固体节拍器系统

json - 解析单个 JSON 元素时出现问题 (Swift)

arrays - Swift - 对数组的子集进行排序

iOS UITableView 单元格重复

ios - iOS 中的构建对象文件扩展名是什么?

ios - 突出显示 UITableView 而不选择

表格 View 单元格中的iOS map View 错误的框架原点

iphone - 两个 UIScrollViews,同步滚动