ich eine Schicht soll so verhalten:CABasicAnimation läuft nach Implizite Animation,
Stattdessen verhält es sich wie folgt aus:
Die Karte Flip-Animation von zwei erstellt wird CABasicAnimation
s in einem CAAnimationGroup
angewendet. Der falsche Spin-Effekt tritt auf, weil die implizite Animation aus der Eigenschaftsänderung CALayer
zuerst ausgeführt wird und dann meine in CABasicAnimation
angegebene Animation ausgeführt wird. Wie kann ich die Ausführung der impliziten Animation stoppen, sodass nur meine angegebene Animation ausgeführt wird?
Hier ist der entsprechende Code:
class ViewController: UIViewController {
var simpleLayer = CALayer()
override func viewDidLoad() {
super.viewDidLoad()
let tap = UITapGestureRecognizer(target: self, action: #selector(handleTap))
self.view.addGestureRecognizer(tap)
simpleLayer.frame = CGRect(origin: CGPoint(x: view.bounds.width/2 - 50, y: view.bounds.height/2 - 50), size: CGSize(width: 100, height: 100))
simpleLayer.backgroundColor = UIColor.blackColor().CGColor
view.layer.addSublayer(simpleLayer)
}
func handleTap() {
let xRotation = CABasicAnimation(keyPath: "transform.rotation.x")
xRotation.toValue = 0
xRotation.byValue = M_PI
let yRotation = CABasicAnimation(keyPath: "transform.rotation.y")
yRotation.toValue = 0
yRotation.byValue = M_PI
simpleLayer.setValue(M_PI, forKeyPath: "transform.rotation.y")
simpleLayer.setValue(M_PI, forKeyPath: "transform.rotation.x")
let group = CAAnimationGroup()
group.animations = [xRotation, yRotation]
group.duration = 0.6
group.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut)
simpleLayer.addAnimation(group, forKey: nil)
}
}
Ich bin eigentlich nicht positiv, wenn 'setValue (_: forKeyPath:)' wird von Core Animation überwacht, um implizite Animationen zu aktivieren oder nicht. Wenn Sie diese beiden Funktionsaufrufe mit einer ['CATtransaction' umgeben, die Aktionen deaktiviert] (http://calayer.com/core-animation/2016/05/17/catransaction-in-depth.html#preventing-animations-from- auftritt), behebt das das Problem? – LucasTizma
Danke, @ LucasTizma! Das war der richtige Code. Ich habe es in einer Antwort unten ausführlich beschrieben. –
Ich habe einen Downvote für die ursprüngliche Frage erhalten, jetzt ist der Wert "-1". Ich bin mir nicht sicher, warum ich den Downvote erhalten habe. Wenn der Downvoter einen Kommentar abgeben könnte, würde ich mich gerne mit seinem Anliegen befassen. Dies ist nicht so genau ein Anwendungsfall, wie es scheint. Diese Frage ist generisch anwendbar. Wenn Sie den Code zum Deaktivieren der impliziten Animation nicht hinzufügen, verhält sich die CAAnimationGroup nicht wie erwartet. –