2015-12-02 123 views
5

我繼承了UIImageView,以便每次設置圖像屬性時都會發生動畫。以下是成功的:覆蓋UIImageView的圖像getter/setter方法

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方法

回答

6

只需使用super.image來代替,這將防止循環。

+0

Omg當然。謝謝! – cph2117

0

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