设置图像属性时,UIImageView图像不会明显更新

时间:2018-06-10 18:52:25

标签: 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上,没有任何明显的事情发生。

这很奇怪。通过在调试器中暂停,我可以看到正在构造新图像:

enter image description here

图像替换,但图像视图未被重绘。添加setNeedsDisplay之类的调用无效。

此外,如果我继续使用不同的图像替换图像视图的图像,我会看到红色图像!

    iv.image = im2
    delay(0.5) {
        iv.image = im // causes im2 to appear!
    }

某种幕后缓存显然会导致图像视图在其显示中落后于一张图像。

任何人都可以对此有所了解吗?它可能是iOS本身的一个错误,也许在9.2中具体;如何解决它? (显然,人们可以替换另一个图像视图批发,但这不会告诉我们缓存是怎么回事。)

1 个答案:

答案 0 :(得分:2)

这似乎是一种解决方法:

iv.image = im2
delay(0.05) {
    iv.image = nil
    iv.image = im2
}

但真是恐怖......省略任何这些分配,或将delay减少为零(例如通过调用DispatchQueue.main.async)会导致变通方法失败。