2017-10-08 10 views
1

J'ai essayé de créer une animation qui simule un lancer de pièce de monnaie. C'est ce que j'utilise actuellement, mais il y a un léger décalage entre chaque exécution de l'animation, et je ne pense pas que UIView.transition soit la meilleure façon de le faire.Comment faire une animation en continu?

var duration: CGFloat = 0.25 
var imageIndex = 1 
var repeatCount = 0 

@objc func handleSpin() 
{ 
    let options: UIViewAnimationOptions = .transitionFlipFromLeft 

    UIView.transition(with: self.coinImageView, duration: TimeInterval(duration), options: options, animations: nil) { (completed) in 

     if self.repeatCount == 10 
     { 
      self.duration = 0.25 
      self.imageIndex = 1 
      self.repeatCount = 0 
      return 
      //animation done 
     } 
     else 
     { 
      self.coinImageView.image = UIImage(named: self.imageNames[self.imageIndex]) 
      self.duration += 0.075 
      self.repeatCount += 1 
      self.imageIndex = self.imageIndex == self.imageNames.count - 1 ? 0 : self.imageIndex + 1 
      self.handleSpin() 
     } 
    } 

Cette fonction s'appelle elle-même 10 fois, augmentant légèrement la durée de l'animation à chaque fois. Mais comme je l'ai dit, le problème est qu'il y a un léger décalage entre chaque exécution que je veux réparer.

J'ai aussi essayé avec CATransition, et l'ajouter à la couche de imageView comme ceci:

func flipAnimation() 
{ 
    let animation = CATransition() 
    animation.type = "flip" 
    animation.startProgress = 0 
    animation.endProgress = 0.5 
    animation.subtype = "fromLeft" 
    animation.duration = 0.5 
    animation.repeatCount = 0 

    self.layer.add(animation, forKey: "animation") 
} 

Le problème ici est que je ne peux pas l'image de rester retournée, car elle revient à par défaut lorsque l'animation se termine, en outre, je ne sais pas comment garder une trace de quand l'animation est terminée.

Y at-il une troisième et meilleure façon de le faire?

EDIT: Je devrais mentionner que j'ai également essayé d'employer la bibliothèque de ressort, mais il a le même problème avec CATransition; quand l'animation finit l'image est revenue à son état normal et je ne trouve aucun moyen d'empêcher cela.

+0

Ajoutez l'échantillon d'animation que vous voulez et l'animation que vous obtenez de votre code. –

+0

Ok, je vais télécharger une courte vidéo dès que possible. – Elhoej

+0

cochez la réponse https://stackoverflow.com/a/22549926/2963352 – vivek

Répondre

0

Vous pouvez essayer d'animer des images clés, peut-être ce serait mieux:

extension UIView { 
    func startAnimatingFlip(with duration: TimeInterval) { 
     UIView.setAnimationCurve(.linear) 
     UIView.animateKeyframes(withDuration: duration/2, delay: 0, options: .beginFromCurrentState, animations: { 
      UIView.setAnimationCurve(.linear) 
      UIView.addKeyframe(withRelativeStartTime: duration/2, relativeDuration: 0.5, animations: { 
       self.transform = CGAffineTransform(scaleX: -1, y: 1) 
      }) 
      UIView.addKeyframe(withRelativeStartTime: 0.5, relativeDuration: 0.5, animations: { 
       self.transform = CGAffineTransform(scaleX: 1, y: 1) 
      }) 
     }) { _ in 
      self.startAnimatingFlip(with: duration) 
     } 
    } 
} 

Bien sûr, vous devrez l'adapter à vos besoins. Mais en termes d'animation, ne semble pas avoir de retard entre les images clés.