ios - 设置图像属性时,UIImageView 图像不会明显更新
问题描述
我有一个 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 上,没有任何明显的反应。
有点奇怪。通过在调试器中暂停,我可以看到新图像正在正确构建:
图像被替换,但图像视图没有被重绘。添加调用 likesetNeedsDisplay
什么都不做。
此外,如果我继续用不同的图像替换图像视图的图像,我会看到红色图像!
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
),会导致解决方法失败。
推荐阅读
- dns - 从领事 DNS 查找中间删除“节点”子域
- excel - 预测未来值并忽略空单元格的功能
- python - 从 torch.Tensor 中删除一个元素
- cypress - 赛普拉斯 - 当其他网址上的身份重定向时,我的测试无法继续
- javascript - 接收字符串而不是数组
- flutter - Flutter:从指定位置访问文件
- highcharts - 在 Highcharts 组织结构图中向下钻取?
- mysql - 如果其中一列的数据超过 1024 个字符,则不返回记录集 Mysql 8.0 和 Classic ASP
- python - 从熊猫数据框中绘制按时间顺序排序的数据
- python - Python lambda反向映射