Ich versuche, eine CALayer
in einer iOS-App zu ziehen.
Sobald ich seine Positionseigenschaft ändere, versucht es, die neue Position zu animieren und flackert überall:
layer.position = CGPointMake(x, y)
Wie kann ich mich CALayers
sofort bewegen ? Ich kann mich anscheinend nicht mit der Core Animation API auseinandersetzen.
Antworten:
Sie möchten Ihren Anruf wie folgt abschließen:
[CATransaction begin]; [CATransaction setValue: (id) kCFBooleanTrue forKey: kCATransactionDisableActions]; layer.position = CGPointMake(x, y); [CATransaction commit];
quelle
[UIView performWithoutAnimation:<#^(void)actionsWithoutAnimation#>];
Swift 3-Erweiterung:
extension CALayer { class func performWithoutAnimation(_ actionsWithoutAnimation: () -> Void){ CATransaction.begin() CATransaction.setValue(true, forKey: kCATransactionDisableActions) actionsWithoutAnimation() CATransaction.commit() } }
Verwendung :
CALayer.performWithoutAnimation(){ someLayer.position = newPosition }
quelle
@noescape
Attribut zum Block hinzuzufügen , um zuzulassen (und deutlich zu machen), dassself
es im Block nicht benötigt wirdSie können auch die Komfortfunktion verwenden
[CATransaction setDisableActions:YES]
auch.
Hinweis: Lesen Sie unbedingt die Kommentare von Yogev Shelly, um mögliche Fallstricke zu verstehen.
quelle
Wie andere vorgeschlagen haben, können Sie verwenden
CATransaction
.Das Problem tritt auf, weil CALayer eine implizite Standardanimationsdauer von 0,25 Sekunden hat.
Eine einfachere (meiner Meinung nach) Alternative dazu
setDisableActions
ist daher die VerwendungsetAnimationDuration
mit einem Wert von0.0
.[CATransaction begin]; [CATransaction setAnimationDuration:0.0]; layer.position = CGPointMake(x, y); [CATransaction commit];
quelle
Kombinieren Sie hier frühere Antworten für Swift 4, um die Animationsdauer deutlich 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 }
quelle