Lorsque vous ajouter une animation à un calque, l'animation ne change pas les propriétés de la couche. Au lieu de cela, le système crée une copie de la couche. Le calque d'origine est appelé le modèle de la couche, et la copie est appelée la couche de présentation. La couche de présentation de la modification des propriétés au fil de l'animation, mais le modèle de la couche des propriétés restent inchangées.
Lorsque vous retirez l'animation, le système détruit la couche de présentation, ne laissant que la couche du modèle, et le modèle de la couche des propriétés de contrôler la manière dont la couche est dessiné. Donc, si le modèle de la couche propriétés ne correspondent pas à la finale, animée des valeurs de la couche de présentation des propriétés, la couche de réinitialiser instantanément à son apparence avant de l'animation.
Pour résoudre ce problème, vous devez définir le modèle de la couche des propriétés pour les valeurs finales de l'animation, et ensuite ajouter à l'animation de la couche. Vous voulez le faire dans cet ordre, car la modification d'une propriété de calque pouvez ajouter un implicite de l'animation de la propriété, ce qui serait en conflit avec l'animation que vous souhaitez ajouter explicitement. Vous voulez vous assurer que votre explicite animation remplace l'implicite de l'animation.
Alors, comment faites-vous tout cela? La recette de base ressemble à ceci:
CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"position"];
animation.fromValue = [NSValue valueWithCGPoint:myLayer.position];
layer.position = newPosition; // HERE I UPDATE THE MODEL LAYER'S PROPERTY
animation.toValue = [NSValue valueWithCGPoint:myLayer.position];
animation.duration = .5;
[myLayer addAnimation:animation forKey:animation.keyPath];
Je n'ai pas utilisé une animation de groupe, donc je ne sais pas exactement ce que vous pourriez avoir besoin de changer. Je viens de l'ajouter à chaque animation séparément à la couche.
Je trouve aussi qu'il est plus facile d'utiliser l' +[CATransaction setCompletionBlock:]
méthode pour définir un gestionnaire d'achèvement pour une ou plusieurs animations, au lieu d'essayer d'utiliser une animation du délégué. Vous définissez l'opération d'achèvement du bloc, puis ajouter les animations:
[CATransaction begin]; {
[CATransaction setCompletionBlock:^{
[self.imageView removeFromSuperview];
}];
[self addPositionAnimation];
[self addScaleAnimation];
[self addOpacityAnimation];
} [CATransaction commit];