¿Cómo se mueve un CALayer al instante (sin animación)
-
03-07-2019 - |
Pregunta
Estoy intentando arrastrar un CALayer
en una aplicación de iOS.
Tan pronto como cambio su propiedad de posición, intenta animarse a la nueva posición y parpadea por todas partes:
layer.position = CGPointMake(x, y)
¿Cómo puedo mover CALayers
al instante? Parece que no puedo entender la API Core Animation.
Solución
Desea finalizar su llamada en lo siguiente:
[CATransaction begin];
[CATransaction setValue: (id) kCFBooleanTrue forKey: kCATransactionDisableActions];
layer.position = CGPointMake(x, y);
[CATransaction commit];
Otros consejos
Extensión Swift 3:
extension CALayer {
class func performWithoutAnimation(_ actionsWithoutAnimation: () -> Void){
CATransaction.begin()
CATransaction.setValue(true, forKey: kCATransactionDisableActions)
actionsWithoutAnimation()
CATransaction.commit()
}
}
Uso:
CALayer.performWithoutAnimation(){
someLayer.position = newPosition
}
También puede usar la función de conveniencia
[CATransaction setDisableActions:YES]
también.
Nota: asegúrese de leer los comentarios de Yogev Shelly para comprender cualquier problema que pueda ocurrir.
Como otros han sugerido, puede usar CATransaction
.
El problema surge porque CALayer tiene una duración implícita de animación implícita de 0.25 segundos.
Por lo tanto, una alternativa más fácil (en mi opinión) a setDisableActions
es usar setAnimationDuration
con un valor de 0.0
.
[CATransaction begin];
[CATransaction setAnimationDuration:0.0];
layer.position = CGPointMake(x, y);
[CATransaction commit];
Combinando las respuestas anteriores aquí para Swift 4, para hacer que la duración de la animación sea explícita ...
extension CALayer
{
class func perform(withDuration duration: Double, actions: () -> Void) {
CATransaction.begin()
CATransaction.setAnimationDuration(duration)
actions()
CATransaction.commit()
}
}
Uso ...
CALayer.perform(withDuration: 0.0) {
aLayer.frame = aFrame
}