覆盖 UIImageView 的图像 getter/setter 方法

Overriding UIImageView's image getter/setter methods

我正在对 UIImageView 进行子类化,因此每次设置图像 属性 时都会出现动画。以下是成功的:

import UIKit

class AnimatedImageView: UIImageView {

var img: UIImage! {
    get {
        return self.image
    }
    set {
        self.image = newValue

        UIView.animateWithDuration(0.5, delay: 0.4, usingSpringWithDamping: 0.2, initialSpringVelocity: 5.0, options: .CurveEaseIn, animations: {_ in

            self.transform = CGAffineTransformMakeScale(1.1, 1.1);

            }, completion: {_ in
                self.transform = CGAffineTransformIdentity;
        })
    }
}

这并不奇怪。我将 UIImageView 子类化并添加了一个名为 'img' 的全新变量,它又修改了 UIImageView 的 'image' 属性.

问题是最终用户仍然可以想象地改变 AnimatedImageView 的 'image' 属性。

import UIKit

class AnimatedImageView: UIImageView {

override var image: UIImage! {
 get {
     return self.image
 }
 set {
    self.image = newValue

    UIView.animateWithDuration(0.5, delay: 0.4, usingSpringWithDamping: 0.2, initialSpringVelocity: 5.0, options: .CurveEaseIn, animations: {_ in

        self.transform = CGAffineTransformMakeScale(1.1, 1.1);

        }, completion: {_ in
            self.transform = CGAffineTransformIdentity;
    })
 }
}

果然这会导致计算器溢出,因为当我调用 self.image = newValue 时,它会重复调用我在子类中重写的 setter 方法。那么,在 UIImageView

上覆盖 'image' 属性 的 getter/setter 方法的正确方法是什么?

只需使用 super.image 即可,这将防止循环。

使用 super.image 的替代方法是通过 ivar _image 引用图像。这直接引用它,而不调用 getter,并避免了循环。

import UIKit

class AnimatedImageView: UIImageView {

override var image: UIImage! {
 get {
     return _image
 }
 set {
    _image = newValue

    UIView.animateWithDuration(0.5, delay: 0.4, usingSpringWithDamping: 0.2, initialSpringVelocity: 5.0, options: .CurveEaseIn, animations: {_ in

        self.transform = CGAffineTransformMakeScale(1.1, 1.1);

        }, completion: {_ in
            self.transform = CGAffineTransformIdentity;
    })
 }