Come si sposta istantaneamente un CALayer (senza animazione)
-
03-07-2019 - |
Domanda
Sto cercando di trascinare un CALayer
in un'app iOS.
Non appena modifico la proprietà position, tenta di animarsi nella nuova posizione e lampeggia ovunque:
layer.position = CGPointMake(x, y)
Come posso spostare CALayers
all'istante? Sembra che non riesca a orientarmi nell'API Core Animation.
Soluzione
Desideri concludere la tua chiamata come segue:
[CATransaction begin];
[CATransaction setValue: (id) kCFBooleanTrue forKey: kCATransactionDisableActions];
layer.position = CGPointMake(x, y);
[CATransaction commit];
Altri suggerimenti
Estensione Swift 3:
extension CALayer {
class func performWithoutAnimation(_ actionsWithoutAnimation: () -> Void){
CATransaction.begin()
CATransaction.setValue(true, forKey: kCATransactionDisableActions)
actionsWithoutAnimation()
CATransaction.commit()
}
}
Utilizzo:
CALayer.performWithoutAnimation(){
someLayer.position = newPosition
}
Puoi anche usare la funzione convenienza
[CATransaction setDisableActions:YES]
pure.
Nota: assicurati di leggere i commenti di Yogev Shelly per comprendere eventuali problemi che potrebbero verificarsi.
Come altri hanno suggerito, puoi usare CATransaction
.
Il problema sorge poiché CALayer ha una durata di animazione implicita predefinita di 0,25 secondi.
Quindi, un'alternativa più semplice (secondo me) a setDisableActions
è usare setAnimationDuration
con un valore di 0.0
.
[CATransaction begin];
[CATransaction setAnimationDuration:0.0];
layer.position = CGPointMake(x, y);
[CATransaction commit];
Combinando qui le risposte precedenti per Swift 4, per rendere esplicita la durata dell'animazione ...
extension CALayer
{
class func perform(withDuration duration: Double, actions: () -> Void) {
CATransaction.begin()
CATransaction.setAnimationDuration(duration)
actions()
CATransaction.commit()
}
}
Utilizzo ...
CALayer.perform(withDuration: 0.0) {
aLayer.frame = aFrame
}