Question

J'essaie de faire glisser un CALayer dans une application iOS.

Dès que je modifie sa propriété de position, il essaie de s'animer vers la nouvelle position et scintille dans tous les sens:

 layer.position = CGPointMake(x, y)

Comment déplacer CALayers instantanément? Je n'arrive pas à comprendre l’API Core Animation.

Était-ce utile?

La solution

Vous souhaitez terminer votre appel de la manière suivante:

[CATransaction begin]; 
[CATransaction setValue: (id) kCFBooleanTrue forKey: kCATransactionDisableActions];
layer.position = CGPointMake(x, y);
[CATransaction commit];

Autres conseils

Extension Swift 3:

extension CALayer {
    class func performWithoutAnimation(_ actionsWithoutAnimation: () -> Void){
        CATransaction.begin()
        CATransaction.setValue(true, forKey: kCATransactionDisableActions)
        actionsWithoutAnimation()
        CATransaction.commit()
    }
}

Utilisation:

CALayer.performWithoutAnimation(){
    someLayer.position = newPosition
}

Vous pouvez également utiliser la fonction de confort

[CATransaction setDisableActions:YES] 

aussi.

Remarque: Assurez-vous de lire les commentaires de Yogev Shelly pour comprendre les pièges qui pourraient survenir.

Comme d'autres l'ont suggéré, vous pouvez utiliser CATransaction .
Le problème vient du fait que CALayer a une durée d’animation implicite par défaut de 0,25 seconde.

Ainsi, une alternative plus facile (à mon avis) à setDisableActions consiste à utiliser setAnimationDuration avec une valeur de 0.0 .

[CATransaction begin];
[CATransaction setAnimationDuration:0.0];
layer.position = CGPointMake(x, y);
[CATransaction commit];

Combiner les réponses précédentes ici pour Swift 4, pour rendre clairement la durée de l'animation explicite ...

extension CALayer
{
    class func perform(withDuration duration: Double, actions: () -> Void) {
        CATransaction.begin()
        CATransaction.setAnimationDuration(duration)
        actions()
        CATransaction.commit()
    }
}

Utilisation ...

CALayer.perform(withDuration: 0.0) {
            aLayer.frame = aFrame
        }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top