2015-07-22 16 views
15

Jestem zaangażowany w animowanie CAGradientLayer za pomocą Swift. Dla zasobu Używam tego postAnimuj CAGradientLayer w Swift

Tu jest mój kod

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

Mam próbował tego w Objective-C i działa, ale trzeba go używać w Swift i kiedy uruchomić program animuje, ale wraca do poprzedniego koloru na końcu, potrzebuję go, więc pozostań niebieski.

Odpowiedz

24

Sprawdziłem twój kod i znalazłem tutaj jeden błąd. Zapomniałeś ustawić koloru self.gradient po prostu nadajesz kolorom animacje, dlatego animacja działa dobrze, a na końcu widać, że jego kolor sięga red.

napisać ten kod brakuje:

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

Można również sprawdzić kod pracuje tu: Sample

UPDATE: jak mogę powtórzyć tego przejścia gradientu ciągły?

Możesz więc użyć delegate z CAAnimation. Po zakończeniu animacji zostanie wyświetlony komunikat, a następnie można ustawić wartość fromColors i toColors i raz po raz wywoływać funkcję animateLayer(). Ale do tego będziesz musiał wprowadzić kilka zmian w swoim kodzie.

  • Wprowadź fromColors i toColors globalną.
  • Zmień ich wartość w metodzie delegata animationDidStop.
  • Ponownie wywołanie funkcji animateLayer().

Oto ciało delegate metoda:

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

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

I można również sprawdzić kod pracuje tu: Sample

+0

nie mogę uwierzyć, że nie widzi, że dzięki – DrPatience

+0

jak mogę powtórzyć tego przejścia gradientu ciągły? – DrPatience

+0

@DrPatience Jestem spóźniony ... – TheTiger

0

Na przyszłość ... Użycie procesora 100% jest spowodowane przez animationDidStop funkcjonować. Ponownie uruchamia animację, a bieżące animacje nie są zakończone. Proszę sprawdzić gotowego flag

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

     animateLayer() 
    } 
} 
1

Mam próbowano to w Objective-C i działa, ale trzeba go używać w Swift i gdy uruchamiam program to animuje ale sięga poprzedni kolor na końcu, potrzebuję go, więc pozostań niebieski.

Musisz tylko:

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

Nie zalecany, jeśli zmienisz kolory ponownie, nie rozpocznie się od bieżącego koloru –

Powiązane problemy