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

标签 ios swift uiview ios-multithreading

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

最佳答案

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

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

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!)
        }
    }
}

用法
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)
                }
            }

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

关于ios - 如何在后台线程上截取 UIView 的屏幕截图?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52608516/

相关文章:

ios - 菜单选项卡出现问题。我正在使用 carbonKit 框架

ios - 我可以在任意 UIView 变量上设置动画吗?

ios - UIWebViewDelegate DidFinishLoad 未在自定义类中触发(Swift)

swift - 如何循环游戏

iphone - 添加项目时 UITableView 调整大小

iOS Swift 3 - 如何删除照片中最近删除的图像

ios - 如何以编程方式检索 UIScrollView? (iOS 5 Storyboard)

ios - 带有 SpriteKit 的 UITableView

flash - Flash Packager for IOS:编译后的应用程序的性能是否太差而无法使用?

ios - 使用自动布局 Swift 定位 uibutton