Estoy intentando arrastrar un CALayeren 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 CALayersinstante? 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
@noescapeatributo al bloque para permitir (y dejar en claro) queselfno 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)
setDisableActionses usarsetAnimationDurationcon 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