如何在后台线程上截取 UIView 的屏幕截图?

Dem*_*ese 3 uiview ios swift ios-multithreading

我正在开发的应用程序几乎每个屏幕上都有谷歌地图。为了节省内存,我在各处重复使用相同的谷歌地图视图。问题是,当您弹出视图控制器时,您可以看到地图所在的空白区域。为了解决这个问题,我在删除地图之前对其进行了屏幕截图并添加为背景。但还有一个问题,在 iPhoneX 上截图大约需要 0.3 秒(我想在旧手机上情况更糟)。有没有办法在后台线程上截取 UIView 的屏幕截图?

Far*_*med 6

我使用 swift 尝试了所有最新的快照方法。其他方法在后台对我不起作用。但这种方式拍摄快照对我来说很有效。

使用参数视图层和视图边界创建扩展。

extension UIView {
    func asImageBackground(viewLayer: CALayer, viewBounds: CGRect) -> UIImage {
        if #available(iOS 10.0, *) {
            let renderer = UIGraphicsImageRenderer(bounds: viewBounds)
            return renderer.image { rendererContext in
                viewLayer.render(in: rendererContext.cgContext)
            }
        } else {
            UIGraphicsBeginImageContext(viewBounds.size)
            viewLayer.render(in:UIGraphicsGetCurrentContext()!)
            let image = UIGraphicsGetImageFromCurrentImageContext()
            UIGraphicsEndImageContext()
            return UIImage(cgImage: image!.cgImage!)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

用法

DispatchQueue.main.async {
                let layer = self.selectedView.layer
                let bounds = self.selectedView.bounds
                DispatchQueue.global(qos: .background).async {
                    let image = self.selectedView.asImageBackground(viewLayer: layer, viewBounds: bounds)
                }
            }
Run Code Online (Sandbox Code Playgroud)

我们需要在主线程中计算图层和边界,然后其他操作将在后台线程中进行。它将提供流畅的用户体验,用户界面不会出现任何延迟或中断。