【问题标题】:Overriding UIImageView's image getter/setter methods覆盖 UIImageView 的图像 getter/setter 方法
【发布时间】:2015-12-02 22:21:49
【问题描述】:

我将 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 的“图像”属性。

问题在于最终用户仍然可以改变 AnimatedImageView 的“图像”属性。

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 上覆盖“图像”属性的 getter/setter 方法的正确方法是什么

【问题讨论】:

    标签: ios swift uiimageview overriding


    【解决方案1】:

    改用super.image,这样可以防止循环。

    【讨论】:

      【解决方案2】:

      使用 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;
          })
       }
      

      【讨论】:

        猜你喜欢
        • 2011-03-11
        • 2012-12-12
        • 2018-11-08
        • 2014-11-12
        • 1970-01-01
        • 2015-05-11
        相关资源
        最近更新 更多