我有一个UINavigationController,其中包含View ControllerA。将其推入到View ControllerB。ViewController B包含一个Image View,它通过以下代码异步加载其图像:
let ss = MKMapSnapshotter(options: options)
ss!.start { (snapshot, error) in
guard let snappy = snapshot else {
return
}
let snap = snappy.image
...
// create a pinView which gets combined with the snapshot image
...
UIGraphicsBeginImageContextWithOptions(snap.size, false, snap.scale)
snap.draw(at: CGPoint(x: 0, y: 0))
let rect = CGRect(origin: CGPoint(x: self.frame.width/2 - pinView.frame.width/2, y: self.frame.height/2 - pinView.frame.height/2), size: CGSize(width: pinView.frame.width, height: pinView.frame.height))
pinView.drawHierarchy(in: rect, afterScreenUpdates: true)
let finalSnap = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
self.snapshotView.image = finalSnap
}
每当我按下VC B中的“后退”按钮返回VC A时,如果图像尚未完成渲染,则弹出动画非常不连贯/缓慢/不稳定。我对各行进行了注释,以查看哪行造成了缓慢,并且发生在
UIGraphicsGetImageFromCurrentImageContext
上(如果在该行被调用之前按我尝试通过
ss.cancel()
取消MKMapSnapshotter,尝试将UIGraphics上下文部分包装在DispatchQueue.main.async{}
中,还尝试在viewWillDisappear
期间设置一个标志,并检查isMovingFromParentViewController
是否告诉它不运行该行,但是映像创建是异步的,并会立即触发,尚不能保证它已加载。他们都没有为我工作。是否有人了解如何正确地告诉我的VC B停止所有进程,或者如何解决此问题?如果我让快照图像完全加载,则不会发生此问题,但是我不能指望发生这种情况。
最佳答案
在@rmaddy的建议下,我将图像创建移到了后台线程。我确实遇到了一个问题,但是drawHierarchy(in: rect, afterScreenUpdates: true)
不能在后台线程上调用,所以我更改了创建pinView的方式,这样我只需要通过画入将UIImage添加到当前图形上下文中即可直。
最终代码如下所示:
DispatchQueue.global(qos: .background).async {
UIGraphicsBeginImageContextWithOptions(snap.size, false, snap.scale)
snap.draw(at: CGPoint(x: 0, y: 0))
let rect = CGRect(origin: CGPoint(x: self.frame.width/2 - pinView.frame.width/2, y: self.frame.height/2 - pinView.frame.height/2), size: CGSize(width: pinView.frame.width, height: pinView.frame.height))
pinView.image?.draw(in: rect) // changed this to allow background thread execution
let finalSnap = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
// main thread image view assignment
DispatchQueue.main.async {
self.snapshotView.image = finalSnap
}
}
关于ios - UIGraphicsGetImageFromCurrentImageContext导致断断续续的导航 Controller 返回动画,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47045023/