Quel est le meilleur moyen d'arrêter une string d'animations à base de blocs

En supposant une string d'animations à base de blocs comme suit:

UIView * view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 200, 200)]; //animation 1 [UIView animateWithDuration:2 delay:0 options:UIViewAnimationOptionCurveLinear animations:^{ view.frame = CGRectMake(0, 100, 200, 200); } completion:^(BOOL finished){ //animation 2 [UIView animateWithDuration:2 delay:0 options: UIViewAnimationOptionRepeat |UIViewAnimationOptionAutoreverse animations:^{ [UIView setAnimationRepeatCount:1.5]; view.frame = CGRectMake(50, 100, 200, 200); } completion:^(BOOL finished){ //animation 3 [UIView animateWithDuration:2 delay:0 options:0 animations:^{ view.frame = CGRectMake(50, 0, 200, 200); } completion:nil]; }]; }]; 

Quel serait le meilleur moyen d'arrêter ce genre d'animation? Je viens d'appeler

 [view.layer removeAllAnimations]; 

n'est pas suffisant, car cela n'arrête que le bloc d'animation en cours d'exécution et le rest s'exécute en séquence.

Vous pouvez consulter le BOOL finished passé à vos blocs d'achèvement. Ce sera NON dans le cas où vous avez appelé removeAllAnimations .

J'utilise l'approche suivante:

 UIView * view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 200, 200)]; //set the animating flag animating = YES; //animation 1 [UIView animateWithDuration:2 delay:0 options:UIViewAnimationOptionCurveLinear | UIViewAnimationOptionAllowUserInteraction animations:^{ view.frame = CGRectMake(0, 100, 200, 200); } completion:^(BOOL finished){ //stops the chain if(! finished) return; //animation 2 [UIView animateWithDuration:2 delay:0 options: UIViewAnimationOptionRepeat |UIViewAnimationOptionAutoreverse | UIViewAnimationOptionAllowUserInteraction animations:^{ [UIView setAnimationRepeatCount:1.5]; view.frame = CGRectMake(50, 100, 200, 200); } completion:^(BOOL finished){ //stops the chain if(! finished) return; //animation 3 [UIView animateWithDuration:2 delay:0 options:0 animations:^{ view.frame = CGRectMake(50, 0, 200, 200); } completion:nil]; }]; }]; - (void)stop { animating = NO; [view.layer removeAllAnimations]; } 

Le message removeAllAnimations arrête immédiatement le bloc d'animation et son bloc d'achèvement est appelé. Le drapeau d'animation est vérifié là et la string est arrêtée.

Y a-t-il une meilleure façon de le faire?