2017-10-08 4 views
1

私は、コインフリップトスをシミュレートするアニメーションを作成しようとしています。これは私が現在使用しているものですが、各アニメーションの実行に若干の遅延があり、UIView.transitionが最適な方法であるとは思いません。連続フリップアニメーションの作成方法は?

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() 
     } 
    } 

この関数は、それ自身を10回呼び出して、アニメーションの継続時間を少しずつ増やします。しかし、私が言いましたように、私が修正したいそれぞれの実行の間にわずかな遅延があります。

私もCATransitionと試みたが、このようなImageViewの層に追加している:

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") 
} 

ここでの問題、それはに戻りますように私は、反転したまま画像を得ることができないということですアニメーションが終了したときのデフォルト、さらにアニメーションがいつ行われたかを把握する方法がわかりません。

これを行うには3番目の方法がありますか?

編集:私はSpringのライブラリを使ってみましたが、CATransitionと同じ問題があります。アニメーションが終了すると、イメージは元の状態に戻り、私はそれを防ぐ方法を見つけることができません。

+0

コードから取得するアニメーションサンプルをアニメーションサンプルに追加します。 –

+0

私はできるだけ早く短いビデオをアップロードします。 – Elhoej

+0

チェックの答えhttps://stackoverflow.com/a/22549926/2963352 – vivek

答えて

0

あなたがキーフレームをアニメーション化しようとすることができ、多分これは良くなります。もちろん

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) 
     } 
    } 
} 

を、あなたのニーズに合わせて調整する必要があります。しかし、アニメーションの面では、キーフレーム間に遅延がないようです。

関連する問題