2015-07-22 14 views
15

Sto cercando di animare CAGradientLayer usando Swift. Per una risorsa Sto usando questo postAnimate CAGradientLayer in Swift

Ecco il mio codice

class ViewController: UIViewController { 

    var gradient : CAGradientLayer?; 

    override func viewDidLoad() { 
    super.viewDidLoad() 
    } 

    override func viewDidAppear(animated: Bool) { 

    self.gradient = CAGradientLayer() 
    self.gradient?.frame = self.view.bounds 
    self.gradient?.colors = [ UIColor.redColor().CGColor, UIColor.redColor().CGColor] 
    self.view.layer.insertSublayer(self.gradient, atIndex: 0) 

    animateLayer() 
    } 

    func animateLayer(){ 

    var fromColors = self.gradient?.colors 
    var toColors: [AnyObject] = [ UIColor.blueColor().CGColor, UIColor.blueColor().CGColor] 

    var animation : CABasicAnimation = CABasicAnimation(keyPath: "colors") 

    animation.fromValue = fromColors 
    animation.toValue = toColors 
    animation.duration = 3.00 
    animation.removedOnCompletion = true 
    animation.fillMode = kCAFillModeForwards 
    animation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionLinear) 
    animation.delegate = self 

    self.gradient?.addAnimation(animation, forKey:"animateGradient") 
    } 
} 

ho tentato questo in Objective-C e funziona, ma ho bisogno di usarlo in Swift e quando faccio funzionare il programma si anima ma torna al colore precedente alla fine, ne ho bisogno quindi rimani blu.

risposta

24

Ho controllato il codice e ho trovato un errore qui. Hai dimenticato di impostare il colore di self.gradient stai dando dei colori all'animazione, questo è il motivo per cui l'animazione sta funzionando bene e alla fine si vede che il suo colore torna a red.

Scrivi questo codice mancante:

var toColors: [AnyObject] = [UIColor.blueColor().CGColor, UIColor.blueColor().CGColor] 
self.gradient.colors = toColors // You missed this line 
var animation : CABasicAnimation = CABasicAnimation(keyPath: "colors") 

È inoltre possibile controllare il codice di lavoro qui: Sample

UPDATE: come faccio ripetere questa transizione gradiente continuo?

Quindi è possibile utilizzare delegate di CAAnimation. Ti farà sapere una volta che l'animazione è stata completata, quindi puoi impostare il valore fromColors e toColors e chiamare ancora e ancora la funzione animateLayer(). Ma per questo dovrai apportare alcune modifiche al tuo codice.

  • Fare fromColors e toColors globale.
  • Modificare il loro valore nel metodo delegato animationDidStop.
  • Chiamare nuovamente la funzione animateLayer().

Ecco il corpo delegate metodo:

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

    self.toColors = self.fromColors; 
    self.fromColors = self.gradient?.colors 
    animateLayer() 
} 

E si può anche verificare il codice di lavoro qui: Sample

+0

non riesco a credere che non ho visto che grazie – DrPatience

+0

come faccio ripetere questa transizione gradiente continuo? – DrPatience

+0

@DrPatience Sono in ritardo ... – TheTiger

0

Per riferimento futuro ... L'utilizzo della CPU al 100% è causato dal animationDidStop funzione. Riavvia l'animazione mentre le animazioni correnti non sono terminate. Si prega di verificare la bandiera finita:

override func animationDidStop(anim: CAAnimation, finished: Bool) { 
    if finished { 
     self.toColors = self.fromColors; 
     self.fromColors = self.gradient?.colors 

     animateLayer() 
    } 
} 
1

ho tentato questo in Objective-C e funziona, ma ho bisogno di usarlo a Swift e quando faccio funzionare il programma che anima, ma risale al colore precedente alla fine, ne ho bisogno, quindi resta blu.

è necessario solo:

animation.removedOnCompletion = false // not true like in your code 
+0

Non consigliato, se cambi di nuovo i colori non inizierà dal colore corrente –