[Ios] Annuler une animation UIView?


Answers

Utilisation:

#import <QuartzCore/QuartzCore.h>

.......

[myView.layer removeAllAnimations];
Question

Est-il possible d'annuler une animation UIView en cours? Ou devrais-je passer au niveau CA?

c'est-à-dire que j'ai fait quelque chose comme ça (peut-être mettre une animation de fin aussi):

[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:duration];
[UIView setAnimationCurve: UIViewAnimationCurveLinear];
// other animation properties

// set view properties

[UIView commitAnimations];

Mais avant que l'animation se termine et que j'obtienne l'animation terminée, je veux l'annuler (couper court). Est-ce possible? Googling autour trouve quelques personnes qui posent la même question sans réponses - et une ou deux personnes spéculant que cela ne peut pas être fait.




[UIView setAnimationsEnabled:NO];
// your code here
[UIView setAnimationsEnabled:YES];






Même si vous annulez l'animation dans les manières ci-dessus, l'animation didStopSelector toujours didStopSelector . Donc, si vous avez des états logiques dans votre application entraînés par des animations, vous aurez des problèmes. Pour cette raison, avec les méthodes décrites ci-dessus, j'utilise la variable de UIView animations UIView . Si vous passez l'état actuel de votre programme par le param contextuel à l'animation, lorsque l'animation s'arrête, votre fonction didStopSelector peut décider si elle doit faire quelque chose ou simplement retourner en fonction de l'état actuel et de la valeur d'état passée en contexte.




Sur iOS 4 et supérieur, utilisez l'option UIViewAnimationOptionBeginFromCurrentState sur la deuxième animation pour couper la première animation courte.

À titre d'exemple, supposons que vous ayez une vue avec un indicateur d'activité. Vous souhaitez faire disparaître l'indicateur d'activité pendant le début d'une activité qui prend du temps, et l'éteindre lorsque l'activité est terminée. Dans le code ci-dessous, la vue avec l'indicateur d'activité est appelée activityView .

- (void)showActivityIndicator {
    activityView.alpha = 0.0;
    activityView.hidden = NO;
    [UIView animateWithDuration:0.5
                 animations:^(void) {
                     activityView.alpha = 1.0;
                 }];

- (void)hideActivityIndicator {
    [UIView animateWithDuration:0.5
                 delay:0 options:UIViewAnimationOptionBeginFromCurrentState
                 animations:^(void) {
                     activityView.alpha = 0.0;
                 }
                 completion:^(BOOL completed) {
                     if (completed) {
                         activityView.hidden = YES;
                     }
                 }];
}



Pour suspendre une animation sans revenir à l'état original ou final:

CFTimeInterval paused_time = [myView.layer convertTime:CACurrentMediaTime() fromLayer:nil];
myView.layer.speed = 0.0;
myView.layer.timeOffset = paused_time;



Si vous animez une contrainte en modifiant la constante au lieu d'une propriété view, aucune des autres méthodes ne fonctionne sur iOS 8.

Exemple d'animation:

self.constraint.constant = 0;
[self.view updateConstraintsIfNeeded];
[self.view layoutIfNeeded];
[UIView animateWithDuration:1.0f
                      delay:0.0f
                    options:UIViewAnimationOptionCurveLinear
                 animations:^{
                     self.constraint.constant = 1.0f;
                     [self.view layoutIfNeeded];
                 } completion:^(BOOL finished) {

                 }];

Solution:

Vous devez supprimer les animations des couches des vues affectées par le changement de contrainte et leurs sous-couches.

[self.constraintView.layer removeAllAnimations];
for (CALayer *l in self.constraintView.layer.sublayers)
{
    [l removeAllAnimations];
}