2015-12-02 13 views
5

Sto creando una sottoclasse di UIImageView, in modo che ogni volta che si imposta la proprietà dell'immagine si verifichi un'animazione. Quanto segue ha avuto successo:Sovrascrittura dei metodi getter/setter dell'immagine di 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; 
     }) 
    } 
} 

Questa non è una sorpresa. Ho creato una sottoclasse di UIImageView e aggiunto una variabile completamente nuova chiamata 'img', che a sua volta modifica la proprietà 'immagine' di UIImageView.

Il problema è che l'utente finale potrebbe ancora alterare la proprietà "immagine" di 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; 
    }) 
} 
} 

abbastanza sicuro che questo provoca uno StackOverflow perché quando chiamo self.image = newValue ripetutamente chiama il metodo setter che ho sovrascritto nel mio sottoclasse. Quindi, qual è il modo giusto per sovrascrivere i metodi getter/setter della proprietà 'image' su UIImageView

risposta

6

Utilizzare invece super.image per impedire un loop.

+0

Omg ovviamente. Grazie! – cph2117

0

Un'alternativa all'utilizzo di super.image sarebbe quella di fare riferimento all'immagine tramite l'immagine di ivar. Questo lo fa direttamente, senza chiamare il getter, ed evita il loop.

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; 
    }) 
} 
Problemi correlati