afterScreenUpdates 时 drawHierarchy 失败:true
drawHierarchy fails when afterScreenUpdates: true
我正在使用以下代码来抓取我的视图的屏幕截图。
UIGraphicsBeginImageContext(self.view.bounds.size)
self.view.drawHierarchy(in: self.view.bounds, afterScreenUpdates: true)
let wholeImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
如果我将 "afterScreenUpdates:" 设置为 false,它会正常工作。但是,如果我将其设置为 true,则会出现以下错误:
*** Assertion failure in -[UIApplication _performWithUICACommitStateSnapshotting:](), /BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKit/UIKit-3600.5.2/UIApplication.m:6882
使用断点,我发现错误抛在drawHierarchy方法上。有人以前见过这个错误吗?知道发生了什么事吗?在抓取快照之前,我尝试删除对视图的任何更新(隐藏一些 uiimages),但它没有任何效果。
奇怪的旁注:应用程序因此错误而冻结,但没有硬停止(我无法与调试器交互以查看回溯)。抱歉,如果不清楚。
我也遇到了这个错误。问题是 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()
}
我正在使用以下代码来抓取我的视图的屏幕截图。
UIGraphicsBeginImageContext(self.view.bounds.size)
self.view.drawHierarchy(in: self.view.bounds, afterScreenUpdates: true)
let wholeImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
如果我将 "afterScreenUpdates:" 设置为 false,它会正常工作。但是,如果我将其设置为 true,则会出现以下错误:
*** Assertion failure in -[UIApplication _performWithUICACommitStateSnapshotting:](), /BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKit/UIKit-3600.5.2/UIApplication.m:6882
使用断点,我发现错误抛在drawHierarchy方法上。有人以前见过这个错误吗?知道发生了什么事吗?在抓取快照之前,我尝试删除对视图的任何更新(隐藏一些 uiimages),但它没有任何效果。
奇怪的旁注:应用程序因此错误而冻结,但没有硬停止(我无法与调试器交互以查看回溯)。抱歉,如果不清楚。
我也遇到了这个错误。问题是 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()
}