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 todos lados:
layer.position = CGPointMake(x, y)
¿Cómo puedo moverme al CALayers
instante? Parece que no puedo entender la API de animación principal.
Respuestas:
Desea terminar su llamada de la siguiente manera:
[CATransaction begin]; [CATransaction setValue: (id) kCFBooleanTrue forKey: kCATransactionDisableActions]; layer.position = CGPointMake(x, y); [CATransaction commit];
fuente
[UIView performWithoutAnimation:<#^(void)actionsWithoutAnimation#>];
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 }
fuente
@noescape
atributo al bloque para permitir (y dejar en claro) queself
no se necesita en el bloqueTambién puede utilizar la función de conveniencia
[CATransaction setDisableActions:YES]
también.
Nota: asegúrese de leer los comentarios de Yogev Shelly para comprender cualquier error que pueda ocurrir.
fuente
Como han sugerido otros, puede usar
CATransaction
.El problema surge porque CALayer tiene una duración de animación implícita predeterminada de 0,25 segundos.
Por lo tanto, una alternativa más fácil (en mi opinión)
setDisableActions
es usarsetAnimationDuration
con un valor de0.0
.[CATransaction begin]; [CATransaction setAnimationDuration:0.0]; layer.position = CGPointMake(x, y); [CATransaction commit];
fuente
Combinando respuestas anteriores aquí para Swift 4, para hacer claramente explícita la duración de la animación ...
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 }
fuente