2016-11-03 1 views
0

Ich habe dieses Szenario mit den Animationen von UIView ohne Probleme verwendet, kann aber nicht mit der CALayer-Animation arbeiten.Wie startet man die CALayer-Animation, während sie gerade läuft?

Ich habe einen Spielplatz, das Problem zu demonstrieren:

import UIKit 
import PlaygroundSupport 

class EventHandler { 
    @objc func onClick(_ button: UIButton) { 

     button.layer.removeAllAnimations() 

     button.layer.borderColor = UIColor.red.cgColor 
     print("RED") 

     CATransaction.begin() 
     CATransaction.setCompletionBlock({ 
      button.layer.borderColor = UIColor.black.cgColor 
      print("BLACK") 
     }) 

     let colorAnimation = CABasicAnimation() 
     colorAnimation.toValue = UIColor.black.cgColor 
     colorAnimation.duration = 5 
     button.layer.add(colorAnimation, forKey: "borderColor") 
     CATransaction.commit() 

    } 
} 

let eventHandler = EventHandler() 

let button = UIButton(frame: CGRect.init(x: 0, y: 0, width: 200, height: 200)) 

button.backgroundColor = UIColor.gray 
button.layer.borderColor = UIColor.black.cgColor 
button.layer.borderWidth = 20 
button.addTarget(eventHandler, action: #selector(EventHandler.onClick(_:)), for: .touchDown) 

PlaygroundPage.current.liveView = button 

Was ich will, ist, wenn ich den Knopf in der Mitte der Animation klicken, wird die Animation von vorne anfangen sollte. Aber es scheint, als wenn ich removeAllAnimations() aufrufen, wird der Completion-Block der ursprünglichen Animation nicht ausgeführt, bevor ich die Farbe auf RED setze, sondern danach.

+0

Habe ich das richtig verstanden, dass die Schaltfläche gemeint ist seine Grenze Farbe schwarz von rot zu animieren, dass es schwarz ist, wenn sie nicht Animieren, und das bei einem Neustart der Animation wird neu gestartet springt auf rot wieder? –

+0

Ja, das wollte ich. Ich habe gerade die Lösung gefunden, indem ich fromValue auf das Animationsobjekt gesetzt habe. –

Antwort

1

Das Problem wurde behoben, indem fromValue auf das Animationsobjekt gesetzt wurde. Hier arbeitet Version:

import UIKit 
import PlaygroundSupport 

class EventHandler { 
    @objc func onClick(_ button: UIButton) { 

     button.layer.removeAllAnimations() 

     let colorAnimation = CABasicAnimation() 
     colorAnimation.fromValue = UIColor.red.cgColor 
     colorAnimation.toValue = UIColor.black.cgColor 
     colorAnimation.duration = 5 
     button.layer.add(colorAnimation, forKey: "borderColor") 
    } 
} 

let eventHandler = EventHandler() 

let button = UIButton(frame: CGRect.init(x: 0, y: 0, width: 200, height: 200)) 

button.backgroundColor = UIColor.gray 
button.layer.borderColor = UIColor.black.cgColor 
button.layer.borderWidth = 20 
button.addTarget(eventHandler, action: #selector(EventHandler.onClick(_:)), for: .touchDown) 

PlaygroundPage.current.liveView = button 
+1

In diesem Fall brauchen Sie den Abschlussblock nicht (der Eigenschaftswert ist immer schwarz). –

+0

In der Tat! Vielen Dank! –

Verwandte Themen