如何在 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 属性?然后自定义willSetdidSet? 你能用代码解释一下吗?我不知道你在说什么????说真的,我这辈子都没用过did and willSet@RYZheng​​span> 【参考方案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 触摸

如何检测哪个视图正在平移手势 Swift

如何在 Swift 中的 UIImageView 中添加文本?

如何在 Swift 中使用 UIImageView 设置背景图像

如何在 Swift 中调整 UIImageView 的大小