设置图像 属性 时,UIImageView 图像不会明显更新
UIImageView image does not update visibly when image property is set
我有一个 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
}
我希望当我点击图像视图时显示的图像被纯红色图像取代。这在我的 High Sierra 机器 运行 Xcode 9.4 上运行良好。但是在我的 Sierra MacBook 运行 Xcode 9.2 上,没有明显的反应。
这很奇怪。通过在调试器中暂停,我可以看到正在正确构建新图像:
正在替换图像 ,但未重绘图像视图。添加像 setNeedsDisplay
这样的调用没有任何作用。
此外,如果我继续用 不同 图像替换图像视图的图像,我会看到 red 图像!
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
),会导致解决方法失败。
遇到这个问题Xcode 13.在xib文件中将contentModel
设置为center
或
iv.contentMode = .center
我有一个 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
}
我希望当我点击图像视图时显示的图像被纯红色图像取代。这在我的 High Sierra 机器 运行 Xcode 9.4 上运行良好。但是在我的 Sierra MacBook 运行 Xcode 9.2 上,没有明显的反应。
这很奇怪。通过在调试器中暂停,我可以看到正在正确构建新图像:
正在替换图像 ,但未重绘图像视图。添加像 setNeedsDisplay
这样的调用没有任何作用。
此外,如果我继续用 不同 图像替换图像视图的图像,我会看到 red 图像!
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
),会导致解决方法失败。
遇到这个问题Xcode 13.在xib文件中将contentModel
设置为center
或
iv.contentMode = .center