repeatcountを1に設定し、各アニメーションが停止した後にアニメーションを再追加します。私は非常に基本的な正方形のビューでそれをテストして以来、あなたのシナリオでこれがパフォーマンスの問題を引き起こすかどうかはわかりません。これらの通常のアニメーションループのために、またはkCAMediaTimingFunctionEaseIn
などのカスタムいずれかを使用する - - キーアニメーションフレームのためのスムーズな移行を示すために、CAMediaTimingFunction
パラメータを追加することにより
、あなたはkCAMediaTimingFunctionLinear
を使用するかどうかを制御することができます。
// your function to start the acceleration
@IBAction func buttonTapped(_ sender: UIButton) {
accel = true
speed = 2.0
timeOffset = self.rect.layer.convertTime(CACurrentMediaTime(), from: nil)
timeOffset = timeOffset - lastStart
// memorize the timeoffset, new speed (2x) and a boolean flag
self.rect.layer.removeAllAnimations()
}
// delegate - memorize the CFTimeInterval
func animationDidStart(_ anim: CAAnimation) {
lastStart = self.rect.layer.convertTime(CACurrentMediaTime(), from: nil)
}
// delegate - start a new loop of animation each time it's stopped
func animationDidStop(_ anim: CAAnimation, finished flag: Bool) {
if accel {
accel = false
let opt = CAMediaTimingFunction(controlPoints: 0.5, 0.2, 0.9, 0.7)
rotateAnimation(theView: rect, speed: speed, fromValue: CGFloat(.pi * 2.0 * Float(timeOffset)/10.0), toValue: CGFloat(.pi * 2.0 * Float(timeOffset)/10.0 + .pi * 2.0), option: opt)
} else {
rotateAnimation(theView: rect, speed: speed, fromValue: CGFloat(.pi * 2.0 * Float(timeOffset)/10.0), toValue: CGFloat(.pi * 2.0 * Float(timeOffset)/10.0 + .pi * 2.0))
// note that timeOffset is initialize to be 0.
}
}
あなたは0.5の勾配で開始し、徐々に1.0に増加し、ここではカスタムCAMediaTimingFunctionをしたい、私はあなたがあなた自身の希望曲線を行うことができ、ここでベジエ曲線を最適化しませんでした。
最後に、あなたのアニメーション機能に少し微調整:
func rotateAnimation(theView: UIView, speed: Float, duration: CFTimeInterval = 10.0, fromValue: CGFloat = CGFloat(0.0), toValue: CGFloat = CGFloat(.pi * 2.0), option: CAMediaTimingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionLinear)) {
let rotateAnimation = CABasicAnimation(keyPath: "transform.rotation")
rotateAnimation.fromValue = fromValue
rotateAnimation.toValue = toValue
rotateAnimation.duration = duration
rotateAnimation.speed = speed
rotateAnimation.repeatCount = 1
rotateAnimation.delegate = self
rotateAnimation.timingFunction = option
theView.layer.add(rotateAnimation, forKey: nil)
}
非常にスムーズにアニメーションの速度が向上しますか? – 3stud1ant3
@ 3stud1ant3いいえ、それは速度を変えますが、数秒後にアニメーションは元の速度に戻ります。 – NoKey
継続時間を変更するのと同じノートで、アニメーションの最終位置を指定する条件行でwhileループを試しましたか? – ProgrammingEnthusiast