2017-08-26 8 views
3

をスピードアップ:がスムーズに、私は任意のビューを回転させるために、このコードを使用して実行している回転アニメーション

func rotateAnimation(theView: UIView, duration: CFTimeInterval = 20.0, repeatCount: Float = 200, toValue: CGFloat = CGFloat(.pi * 2.0)) { 
    let rotateAnimation = CABasicAnimation(keyPath: "transform.rotation") 
    rotateAnimation.fromValue = 0.0 
    rotateAnimation.toValue = toValue 
    rotateAnimation.duration = duration 
    rotateAnimation.repeatCount = repeatCount 
    theView.layer.add(rotateAnimation, forKey: nil) 
} 

私は現在実行中のアニメーションをスピードアップする方法を知っていただきたいと思います。たとえば、UIViewが上のコードで回転している場合、どうすれば良い速度で素早く2倍の速さにすることができますか?

So:rotateAnimationを呼び出します。:通常の速度で回転します - >calls?function? - > UIViewがスムーズに所望のスピードに速く回転します - > UIViewは希望のスピードで回転し続けます。

ありがとうございました。

+0

非常にスムーズにアニメーションの速度が向上しますか? – 3stud1ant3

+0

@ 3stud1ant3いいえ、それは速度を変えますが、数秒後にアニメーションは元の速度に戻ります。 – NoKey

+0

継続時間を変更するのと同じノートで、アニメーションの最終位置を指定する条件行でwhileループを試しましたか? – ProgrammingEnthusiast

答えて

2

コード

 let timer = Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true) { (timer) in 
      self.viewToMove.layer.timeOffset = self.viewToMove.layer.convertTime(CACurrentMediaTime(), from: nil) 
      self.viewToMove.layer.beginTime = CACurrentMediaTime() 
      self.viewToMove.layer.speed += 0.5 

     } 
     timer.fire() 

下にしてみてくださいそれは期間のヘルプを変えるん

+0

ありがとうございます、コードのいくつかの行で動作します:) –

0

あなたはスピード

func rotateAnimation(theView: UIView, duration: CFTimeInterval = 0.4, repeatCount: Float = 200, toValue: CGFloat = CGFloat(.pi * 2.0)) { 
    let rotateAnimation = CABasicAnimation(keyPath: "transform.rotation") 
    rotateAnimation.fromValue = 0.0 
    rotateAnimation.toValue = toValue 
    rotateAnimation.duration = duration 
    rotateAnimation.repeatCount = repeatCount 

を高めるために小さな期間を設定し、パフォーマンス向上のために真のshouldRasterize =を設定することができます秒のアニメーション

のためにこれを試してみてください

theView.layer.rasterizationScale = UIScreen.main.scale 
    theView.layer.shouldRasterize = true 

の両方に同じ鍵を使用してくださいアニメーション

theView.layer.add(rotateAnimation, forKey: "animation") 
} 
0

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) 
} 
関連する問題