Comment déplacez-vous un CALayer instantanément (sans animation)
-
03-07-2019 - |
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.
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
}