覆盖 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;
})
}
我正在对 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
只需使用 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;
})
}