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.
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? –
Ja, das wollte ich. Ich habe gerade die Lösung gefunden, indem ich fromValue auf das Animationsobjekt gesetzt habe. –