Wie bewegen Sie CALayer sofort (ohne Animation)
-
03-07-2019 - |
Frage
Ich versuche, eine CALayer
in einem iOS-App zu ziehen.
Sobald ich seine Position Eigenschaft zu ändern versucht es an die neue Position zu animieren und flackert die ganzen Ort:
layer.position = CGPointMake(x, y)
Wie kann ich bewegen CALayers
sofort? Ich kann meinen Kopf um die Core Animation API erscheinen.
Lösung
Sie möchten Ihren Anruf in der folgenden einzuwickeln:
[CATransaction begin];
[CATransaction setValue: (id) kCFBooleanTrue forKey: kCATransactionDisableActions];
layer.position = CGPointMake(x, y);
[CATransaction commit];
Andere Tipps
Swift 3 Erweiterung:
extension CALayer {
class func performWithoutAnimation(_ actionsWithoutAnimation: () -> Void){
CATransaction.begin()
CATransaction.setValue(true, forKey: kCATransactionDisableActions)
actionsWithoutAnimation()
CATransaction.commit()
}
}
Verbrauch:
CALayer.performWithoutAnimation(){
someLayer.position = newPosition
}
Sie können auch die Komfortfunktion nutzen
[CATransaction setDisableActions:YES]
als auch.
. Hinweis: Achten Sie darauf, die Kommentare von Yogev Shelly lesen Fallstricke zu verstehen, die auftreten könnten,
Wie andere vorgeschlagen haben, können Sie CATransaction
verwenden.
Das Problem kommt, entsteht, weil CALayer eine Standard implizite Animationsdauer von 0,25 Sekunden hat.
So wird eine einfache (meiner Meinung nach) Alternative zu setDisableActions
ist setAnimationDuration
mit einem Wert von 0.0
zu verwenden.
[CATransaction begin];
[CATransaction setAnimationDuration:0.0];
layer.position = CGPointMake(x, y);
[CATransaction commit];
Die Kombination von früheren Antworten hier für Swift 4, deutlich die Animationsdauer explizit zu machen ...
extension CALayer
{
class func perform(withDuration duration: Double, actions: () -> Void) {
CATransaction.begin()
CATransaction.setAnimationDuration(duration)
actions()
CATransaction.commit()
}
}
Verwendung ...
CALayer.perform(withDuration: 0.0) {
aLayer.frame = aFrame
}