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
ne serait-il pas juste de changer une.durée = 0.1 pour quelque chose de plus lent? – rambossa
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
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. –