[英]drawHierarchy blocking main thread, any way to do this in the background?
我有以下View
扩展 function 通过将其放入UIHostingController
然后使用UIGraphicsImageRenderer
渲染视图来创建UIImage
视图的 UIImage
extension View {
func snapshot() -> UIImage {
let controller = UIHostingController(rootView: self.ignoresSafeArea())
let view = controller.view
let targetSize = controller.view.intrinsicContentSize
view?.bounds = CGRect(origin: .zero, size: targetSize)
view?.backgroundColor = .clear
let format = UIGraphicsImageRendererFormat()
format.scale = 1
let renderer = UIGraphicsImageRenderer(size: targetSize, format: format)
return renderer.image { _ in
view?.drawHierarchy(
in: controller.view.bounds,
afterScreenUpdates: true
)
}
}
}
这可行,但它完全阻塞了主线程,因此我在屏幕上显示的任何加载微调器都不会旋转。 我该如何阻止它,或者是否有另一种方法可以创建不阻塞主线程的快照? 谢谢!
您不能在后台运行 UI,但作为有关drawHierarchy
的帮助说明:
当您想要将图形效果(例如模糊)应用到视图快照时,请使用此方法。 此方法不如 snapshotView(afterScreenUpdates:) 方法快。
由于您没有应用任何图形效果,您可以使用snapshotView
,它作为帮助再次指出:
此方法非常有效地捕获视图的当前渲染外观并使用它来构建新的快照视图。 您可以将返回的视图用作应用程序中当前视图的视觉替代。 例如,您可以将快照视图用于更新大型视图层次结构可能很昂贵的动画。 因为内容是从已经渲染的内容中捕获的,所以此方法反映了视图的当前视觉外观,并且不会更新以反映计划或正在进行的动画。 但是,调用此方法比尝试自己将当前视图的内容渲染为 bitmap 图像要快。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.