2015-12-02 6 views
5

Я подклассифицирую UIImageView, так что каждый раз, когда устанавливается свойство изображения, происходит анимация. Было выполнено следующее:Переопределение методов getter/setter изображений 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», которая, в свою очередь, модифицирует свойство «image» 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; 
    }) 
} 
} 

Конечно это приводит к StackOverflow, потому что, когда я называю self.image = newValue он неоднократно называет метод установки, который я преодолено в моем подклассу. Итак, каков правильный способ переопределить методы getter/setter свойства image в UIImageView

ответ

6

Вместо этого используйте super.image, что предотвратит цикл.

+0

Омг конечно. Спасибо! – cph2117

0

Альтернативой использованию super.image будет ссылка на изображение через ivar _image. Это напрямую ссылается на него, не вызывая геттер, и избегает цикла.

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; 
    }) 
} 
Смежные вопросы