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.

¿Fue útil?

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
        }
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top