2017-09-21 8 views
0

を遅くします。は、私は3色のグラデーション<em>ゆっくり</em>をアニメーション化するCAGradientLayerアニメーション

私はそうのようなカスタムUIViewを持っている:

class MyView: UIView, CAAnimationDelegate { 

    lazy var gradientLayer: CAGradientLayer = { 
     let l = CAGradientLayer() 
     l.frame = self.frame 
     l.colors = self.colors 
     l.startPoint = CGPoint(x: 0, y: 0) 
     l.endPoint = CGPoint(x: 1, y: 0) 
     l.mask = self.textLayer 
     return l 
    }() 

    lazy var textLayer: CATextLayer = { 
     let l = CATextLayer() 
     l.frame = self.frame 
     l.string = "test".uppercased() 
     l.fontSize = 23 
     return l 
    }() 

    var colors: [CGColor] = [ 
      UIColor.red.cgColor, 
      UIColor.purple.cgColor, 
      UIColor.blue.cgColor 
      ] 

    init() { 
    ... 
    self.layer.addSublayer(gradientLayer) 

    } 

    required init?(coder aDecoder: NSCoder) { 
     fatalError("init(coder:) has not been implemented") 
    } 

    func animate() { 

     var newColors = colors 
     let lastColor: CGColor = newColors.last! 
     newColors.removeLast() 
     newColors.insert(lastColor, at: 0) 

     colors: newColors 
     gradientLayer.colors = newColors 

     let a = CABasicAnimation(keyPath:"colors") 
     a.toValue = newColors 
     a.duration = 0.1 
     a.isRemovedOnCompletion = true 
     a.fillMode = kCAFillModeForwards 
     a.delegate = self 

     gradientLayer.add(a, forKey:"animateGradient") 

    } 

    func animationDidStop(_ anim: CAAnimation, finished flag: Bool) { 

      animate() 
    } 

} 

これは動作しますが、非常に高速です。どのようにしてアニメーションを遅らせることができますか? colorsアレイに数百色を追加する必要があります。これで、循環が十分に行えますか?

おかげ

+0

それだけ遅く何かにa.duration = 0.1を変更することがwouldntの? – rambossa

+0

の場合、 'duration'を小さくするとアニメーションが速くなります。それを大きくすると、流動的なアニメーションがありません。ジャンプではなく、アニメーションである。 – Joseph

+0

あなたは 'UIColor''' red''''''' '' '' '' ''青色 ''メソッドを使ってアニメーションブロック内の値を変更することができます。しかし、あなたは3つの原色をカバーする方法で 'RGB'の組み合わせを行うアルゴリズムを考え出す必要があります。 –

答えて

0

私はあなたのコード内で何かが欠けていない限り、あなたはアニメーションで場合、fromValueを設定していません。きっとあなたはnewColorsに色を切り替える前に、色の以前の値にこれを設定する必要があります。

func animate() { 
    let oldColors = colors 
    var newColors = colors 
    let lastColor: CGColor = newColors.last! 
    newColors.removeLast() 
    newColors.insert(lastColor, at: 0) 

    colors = newColors 
    gradientLayer.colors = newColors 

    let a = CABasicAnimation(keyPath:"colors") 
    // New line here -> 
    a.fromValue = oldColors 
    a.toValue = newColors 
    a.duration = 0.1 
    a.isRemovedOnCompletion = true 
    a.fillMode = kCAFillModeForwards 
    a.delegate = self 

    gradientLayer.add(a, forKey:"animateGradient") 

} 

これは、あなたが本当にあなたのコードが遅れてスナップを作成するために、効果的に設定されたanimation-を取得されていません理由になります遷移。

+0

私はアニメーションを手に入れようとしています。それはあまりにも速いです...あなたはそれが飛ぶのを見ます...私はそれが完了するために1つのサイクルのための分のようなものを取るしたい。 – Joseph

+0

私のコードを試して、継続時間を60に変更すると、速度が遅くなります(私は机から離れているため、コードをテストできません)。 – Sparky

関連する問題