254 votes

Annuler une exécution

Est-il possible d'annuler une UIView animation alors qu'il est en cours? Ou aurais-je à déposer à l'autorité de certification de niveau?

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

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

// set view properties

[UIView commitAnimations];

Mais avant que l'animation est terminée, et j'ai l'animation terminée cas, je veux l'annuler (couper court). Est-ce possible? Googler autour de trouve un peu de gens posent la même question sans réponses et une ou deux personnes en spéculant qu'il ne peut pas être fait.

363voto

Jim Heising Points 2285

Utilisation:

 #import <QuartzCore/QuartzCore.h>

.......

[myView.layer removeAllAnimations];
 

115voto

Stephen Darlington Points 33587

La façon dont je le fais, c'est de créer une nouvelle animation de votre point d'arrivée. Définir une durée très courte et assurez-vous d'utiliser l' +setAnimationBeginsFromCurrentState: méthode pour démarrer à partir de l'état actuel. Quand vous le mettez sur OUI, l'animation en cours est coupé court. Ressemble à quelque chose comme ceci:

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

// set view properties

[UIView commitAnimations];

64voto

matt Points 60113

La plus simple façon d'arrêter toutes les animations sur un point de vue particulier, immédiatement, est-ce:

Lier le projet à QuartzCore.cadre. Au début de votre code:

#import <QuartzCore/QuartzCore.h>

Maintenant, lorsque vous souhaitez arrêter toutes les animations sur une vue morts dans leurs voies, de dire ceci:

[CATransaction begin];
[theView.layer removeAllAnimations];
[CATransaction commit];

La ligne médiane serait de travailler par lui-même, mais il y a un délai jusqu'à la runloop finitions (la "redessiner moment"). Pour éviter que le retard, l'envelopper de la commande dans une transaction explicite bloc comme indiqué. Cela fonctionne pas fourni d'autres modifications ont été effectuées sur cette couche dans le courant runloop.

48voto

Ville Laurikari Points 10484

Sur iOS 4 et plus, utiliser l' UIViewAnimationOptionBeginFromCurrentState option sur la deuxième animation à couper le premier film d'animation court.

Par exemple, supposons que vous avez une vue avec un indicateur d'activité. Vous souhaitez fondu dans l'indicateur d'activité alors que certains potentiellement chronophage activité commence, et à la décoloration, quand l'activité est terminée. Dans le code ci-dessous, la vue avec l'indicateur d'activité s'appellent 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;
                     }
                 }];
}

42voto

tomtaylor Points 1384

Pour annuler une animation, il vous suffit de définir la propriété qui est actuellement en cours d'animation, à l'extérieur de la UIView animation. Qui va arrêter l'animation où il est, et le UIView va passer à la configuration que vous venez de définir.

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