afterScreenUpdates:true时,drawHierarchy失败

时间:2016-11-04 17:51:37

标签: ios swift uigraphicscontext

我使用以下代码来获取我的视图的屏幕截图。

UIGraphicsBeginImageContext(self.view.bounds.size)
self.view.drawHierarchy(in: self.view.bounds, afterScreenUpdates: true)
let wholeImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()

如果我设置" afterScreenUpdates:"为假,它正常工作。但如果我将其设置为true,我会收到以下错误:

*** Assertion failure in -[UIApplication _performWithUICACommitStateSnapshotting:](), /BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKit/UIKit-3600.5.2/UIApplication.m:6882

使用断点,我发现错误抛出了drawHierarchy方法。有没有人见过这个错误?知道发生了什么事吗?在抓取快照之前,我尝试取消对视图的任何更新(隐藏一些uiimages),但它没有任何效果。

奇怪的旁注:应用程序冻结此错误,但没有硬停止(我无法与调试器交互以查看回溯)。对不起,如果不清楚的话。

1 个答案:

答案 0 :(得分:3)

我也遇到了这个错误。问题是iOS中的所有UIKit工作都需要在主线程上完成。一个快速的解决方案是将它包装在主线程的DispatchQueue.async调用中:

var wholeImage : UIImage?

DispatchQueue.main.async {
    UIGraphicsBeginImageContext(self.view.bounds.size)
    self.view.drawHierarchy(in: self.view.bounds, afterScreenUpdates: true)
    self.wholeImage = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
}