如何在 Swift 中检测 UIImageView 上的 UIImageView 更改或 KVO 炒锅
Posted
技术标签:
【中文标题】如何在 Swift 中检测 UIImageView 上的 UIImageView 更改或 KVO 炒锅【英文标题】:how to detect UIImageView changed OR KVO woks on UIImageView in Swift 【发布时间】:2020-10-06 05:59:47 【问题描述】:我正在尝试检测 UIImageView (UIimage) 是否已更改或未使用 KeyValueObserver 或任何其他可能的方法,我的图像视图在第一次加载时有一个图像,所以它不是 image.image != nil
我正在使用 UIPickerController,所以当我选择图像时,值会发生变化,我想检测这种变化,以便我可以运行一些代码,例如 Ex:更改按钮的颜色或启用它
btn.backgroundColor = UIColor.green
btn.isEnabled = true
所以我尝试以这种方式添加观察者,但什么也没发生,没有打印输出,没有断点
let driverPImg: UIImageView =
let image = UIImageView(image: #imageLiteral(resourceName: "DriverPimg"))
image.layer.cornerRadius = 75
image.clipsToBounds = true
image.contentMode = .scaleAspectFill
image.isUserInteractionEnabled = true
image.translatesAutoresizingMaskIntoConstraints = false
return image
()
let key1: String = "key1"
// in ViewDidLoad
override func viewDidLoad()
super.viewDidLoad()
self.ProfileImg.image!.addObserver(self, forKeyPath: key1, options: .new, context: nil)
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?)
if keyPath == key1
print("not changed")
else
print("it did changed")
【问题讨论】:
应该使用image
而不是key1
?也就是说,您为什么要尝试观察图像视图的图像?这似乎是一件很奇怪的事情。
因为我不能这样做[***.com/questions/64183657/…图像视图有一个占位符图像所以它不是零所以我无法检查它是否是@Sweeper
如何创建一个UIImageView
扩展并覆盖image
属性?然后自定义willSet
和didSet
?
你能用代码解释一下吗?我不知道你在说什么????说真的,我这辈子都没用过did and willSet
@RYZhengspan>
【参考方案1】:
UIImageView
子类
覆盖image
属性
在didSet
方法中做一些判断
class SUIImageView: UIImageView
open var didSetImageBlock: ((_ image: UIImage?) -> Void)?
open override var image: UIImage?
didSet
print("did Set image")
if let didSetImage = didSetImageBlock
didSetImage(image)
let driverPImg: SUIImageView =
let image = let image = SUIImageView(image: #imageLiteral(resourceName: "DriverPimg"))
image.layer.cornerRadius = 75
image.clipsToBounds = true
image.contentMode = .scaleAspectFill
image.isUserInteractionEnabled = true
image.translatesAutoresizingMaskIntoConstraints = false
return image
()
// Set the placeholder image before `didSetImageBlock` . So the first time
// you set the placeholder image, `didSetImageBlock` won't be triggered.
// After the `didSetImageBlock` is set, if the image of the ImageView is
// changed, `didSetImageBlock` will be triggered.
driverPImg.didSetImageBlock = (image: UIImage?) in
//
print("did Set Image Block")
如果你还想使用 KVO,最好先阅读这个doc。
【讨论】:
我知道我问的太多了,但这如何回答我的问题如何检测图像变化我看不到你的代码行 已更新。在您的第一次加载中,didSetImageBlock
不会被触发。
好的,没关系,我在同一个视图中有多个图像可以同时触发它们吗if all Values change then do this
且仅当所有print("did Set Image Block")
听起来像是另一个问题,或者您应该编辑您的问题。以上是关于如何在 Swift 中检测 UIImageView 上的 UIImageView 更改或 KVO 炒锅的主要内容,如果未能解决你的问题,请参考以下文章
我如何在 Swift iOS 中检测 UIImageView 中的更改图像
如何在 Swift 中的 UIImageView 中添加文本?