2015-12-02 8 views
5

UIImageViewをサブクラス化するので、画像プロパティが設定されるたびにアニメーションが発生します。以下は成功しました: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をサブクラス化し、UIImageViewの 'image'プロパティを変更する 'img'という全く新しい変数を追加しました。

エンドユーザが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メソッドを呼び出しますので、これはstackoverflowのが原因と案の定。では、UIImageViewの 'image'プロパティのgetter/setterメソッドをオーバーライドする正しい方法は何ですか?

答えて

6

代わりにsuper.imageを使用するとループができなくなります。

+0

もちろんです。ありがとうございました! – 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; 
    }) 
} 
関連する問題