61 votes

Objective-C - CABasicAnimation appliquer les modifications après animation?

Je suis l'aide d' CABasicAnimation de déplacer et redimensionner une image vue. Je veux que l'affichage de l'image à ajouter à la superview, animer, et ensuite être retiré de la superview.

Dans oredr à réaliser que je suis à l'écoute pour déléguer l'appel de mon CAAnimationGroup, et dès qu'il est appelé-je supprimer l'affichage de l'image de la superview.

Le problème est que, parfois, l'image clignote à l'emplacement initial avant d'être retiré de la superview. Quel est le meilleur moyen pour éviter ce problème?

CAAnimationGroup *animGroup = [CAAnimationGroup animation];
    animGroup.animations = [NSArray arrayWithObjects:moveAnim, scaleAnim, opacityAnim, nil];
    animGroup.duration = .5;
    animGroup.delegate = self;
    [imageView.layer addAnimation:animGroup forKey:nil];

189voto

rob mayoff Points 124153

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];

32voto

Kevin Ballard Points 88866

CAAnimations sont automatiquement supprimés lorsque vous avez terminé. Il y a une propriété removedOnCompletion qui contrôle ce. Vous devez spécifier NO.

En outre, il y a quelque chose de connu comme l' fillMode qui contrôle l'animation du comportement avant et après sa durée. C'est une propriété déclarée sur CAMediaTiming ( CAAnimation est conforme aux). Vous devez le régler à l' kCAFillModeForwards.

Avec ces deux modifications de l'animation devrait persister après c'est terminé. Cependant, je ne sais pas si vous avez besoin de changer ces sur le groupe ou sur les différentes animations au sein du groupe, ou les deux.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X