2017-09-06 5 views
4

Ran dans un problème avec une animation d'image UIView. La vue doit animer à la fois l'origine et la taille, la taille augmentant et l'origine se déplaçant linéairement pour conserver la vue au même endroit. Mais ce qui se passe est que la vue diminue jusqu'à la taille (0,0) et augmente ensuite jusqu'à une taille qui n'est toujours pas la taille correcte. Voir la vidéo ci-jointe.UIImageView l'image ne s'anime pas comme prévu (taille et origine)

Vidéo de la question: https://media.pairby.com/I/u/a/IualExcJXn7CqLsGkcNZfwyEw5MKi3SV/v.mp4

func animateIn() { 
    // Make _iconView large 
    let w = bounds.width 
    _iconView.frame = CGRect(
    x: frame.midX - w/2, 
    y: frame.midY - w/2, 
    width: w, height: w) 

    isHidden = false 

    UIView.animate(withDuration: 0.2, animations: { 
    self.alpha = 1 

    // Animate it smaller 
    let w = self.bounds.width * 0.5 
    self._iconView.frame = CGRect(
     x: self.frame.midX - w/2, 
     y: self.frame.midY - w/2, 
     width: w, height: w) 
    }) 
} 

func animateOut() { 
    UIView.animate(withDuration: 3, delay: 0, options: .beginFromCurrentState, animations: { 
    self.alpha = 0 

    // Make it large again 
    let w = self.bounds.width 
    self._iconView.frame = CGRect(
     x: self.frame.midX - w/2, 
     y: self.frame.midY - w/2, 
     width: w, height: w) 

    }, completion: { _ in self.isHidden = true }) 
} 

Plus de détails:

self est une sous-classe de UIView, contraint à un superview.

_iconView est un UIImageView

animateIn est garanti à courir avant animateOut

animateOut est la fonction qui ne fonctionne pas comme prévu, animateIn fonctionne

+1

Je pense que vous oubliez le fait que parce que vous avez réduit de moitié la largeur avant que l'animation est réellement égale à la moitié de ce que vous pensiez (la taille d'origine). donc il ne revient qu'à la moitié de la taille que vous attendez – torinpitchers

+0

'_iconView' est-il un' UIImageView', avec une image "X"? Est-ce que 'self' est la" vue principale "ou un' UIView' sous-classé? Essayez-vous de "faire croître" le X sur toute la largeur de la vue, et de le faire disparaître en transparence? – DonMag

+0

Hey, @torinpitchers. Je n'ai pas réduit de moitié la largeur de l'aperçu (auto). J'utilise les limites de l'aperçu lors des calculs. – Travo

Répondre

0

Ce n'est pas tout à fait clair que tout ce que vous devez faire cependant, ...

  1. Vous n'avez pas besoin de changer la taille pour commencer - vous pouvez simplement animer le cadre _iconView de son état actuel, et

  2. parce _iconView est un sous-vue de self, vous devez positionner par rapport aux limites , pas le cadre.

Essayez comme ceci:

func doAnim() -> Void {  

    UIView.animate(withDuration: 3, delay: 0, options: .beginFromCurrentState, animations: { 
     self.alpha = 0 

     let s = self.bounds.width 
     let halfS = s/2 

     self._iconView.frame = CGRect(
      x: self.bounds.midX - halfS, 
      y: self.bounds.midY - halfS, 
      width: s, 
      height: s) 

    }) 

} 
0

a résolu le problème en supprimant tous _iconView code correspondant de la fonction layoutSubviews(). Je ne sais pas pourquoi on l'appelait en premier lieu.