2017-09-21 4 views
0

Je souhaite animer un dégradé de trois couleurs lentement.Ralentissement de l'animation CAGradientLayer

je une coutume UIView comme ceci:

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

} 

Cela fonctionne, mais il est très rapide. Comment puis-je ralentir l'animation, sans que ça devienne bloquant? Dois-je ajouter quelques centaines de couleurs au tableau colors afin qu'il ait assez de temps pour passer?

Merci

+0

ne serait-il pas juste de changer une.durée = 0.1 pour quelque chose de plus lent? – rambossa

+0

rendant la durée plus courte provoque l'accélération de l'animation. le rendant plus grand et vous n'avez pas une animation fluide. C'est plus un saut, pas une animation. – Joseph

+0

Vous pouvez utiliser la méthode 'UIColor'' red' 'green'' blue' 'alpha' et changer leurs valeurs dans votre bloc d'animation. Mais vous devez trouver un algorithme qui fait les combinaisons de 'RGB' d'une manière qui couvre vos trois couleurs primaires. –

Répondre

0

à moins que je me manque quelque chose dans votre code que vous n'avez pas défini fromValue dans l'animation. Certes, vous devez définir ce à la valeur précédente de couleurs avant de changer de couleur à 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") 

} 

Ce sera la raison pour laquelle vous n'êtes pas vraiment obtenir un Animation- votre code a été mis en place efficacement pour créer un jeu d'enfant retardé transition.

+0

Je reçois une animation c'est juste trop rapide ... vous la voyez voler ... Je veux que ça prenne quelque chose comme une minute pour qu'un cycle se termine. – Joseph

+0

Si vous essayez mon code et changez la durée à 60, est-ce qu'il ralentit (excuses je suis loin de mon bureau et ne peut pas tester le code)? – Sparky