我有一个 UIImageView,其用户交互是真实的,并且我为其提供了点击手势识别器,其操作处理程序如下:
@IBAction func tap(_ sender:UITapGestureRecognizer) {
let iv = sender.view as! UIImageView
let im = iv.image!
let im2 = UIGraphicsImageRenderer(size:im.size).image { _ in
UIColor.red.setFill()
UIBezierPath(rect: CGRect(origin:.zero, size:im.size)).fill()
}
iv.image = im2
}
我希望当我点击图像视图时显示的图像会被纯红色图像替换。这在我运行 Xcode 9.4 的 High Sierra 机器上运行良好。但在我运行 Xcode 9.2 的 Sierra MacBook 上,没有任何明显的变化。
有点奇怪。通过在调试器中暂停,我可以看到新图像正在正确构建:
图片is被替换,但图像视图没有被重绘。添加像这样的调用setNeedsDisplay
什么也没做。
此外,如果我随后继续将图像视图的图像替换为不同的图像,我看到red image!
iv.image = im2
delay(0.5) {
iv.image = im // causes im2 to appear!
}
某种幕后缓存显然导致图像视图在显示时落后于一张图像。
谁能阐明这一点?这可能是 iOS 本身的一个错误,也许是 9.2 中的一个错误;如何解决这个问题? (显然,可以批量替换另一种图像视图,但这并不能告诉我们缓存发生了什么。)
这似乎是一个解决方法:
iv.image = im2
delay(0.05) {
iv.image = nil
iv.image = im2
}
但这真是太可怕了……省略任何这些作业,或者减少delay
为零(例如通过调用DispatchQueue.main.async
相反),导致解决方法失败。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)