【问题标题】:how to detect UIImageView changed OR KVO woks on UIImageView in Swift如何在 Swift 中检测 UIImageView 上的 UIImageView 更改或 KVO 炒锅
【发布时间】: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?也就是说,您为什么要尝试观察图像视图的图像?这似乎是一件很奇怪的事情。
  • 因为我不能这样做[stackoverflow.com/questions/64183657/…图像视图有一个占位符图像所以它不是零所以我无法检查它是否是@Sweeper
  • 如何创建一个UIImageView 扩展并覆盖image 属性?然后自定义willSetdidSet?
  • 你能用代码解释一下吗?我不知道你在说什么????说真的,我这辈子都没用过did and willSet@RYZheng​​span>

标签: ios swift xcode uiimageview key-value-observing


【解决方案1】:
  1. UIImageView 子类
  2. 覆盖image属性
  3. 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")
  • 听起来像是另一个问题,或者您应该编辑您的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多