web-dev-qa-db-fra.com

Arrêtez une animation UIView UIView Auto-Reverse / INFINITE-REPEAT avec un bloc BOOL / Achèvement

Je confie ce qui suit UIView animateWithDuration: méthode, avec l'intention de définir mon animationOn bool ailleurs dans le programme pour annuler cette répétition en boucle infinie. J'étais sous l'impression que le bloc completion serait appelé chaque fois qu'un cycle de l'animation se termine, mais cela ne semble pas être le cas.

Est-ce que le bloc completion est-il appelé dans une animation répétée? Et sinon, y a-t-il une autre façon que je puisse arrêter cette animation de l'extérieur de cette méthode?

- (void) animateFirst: (UIButton *) button
{
    button.transform = CGAffineTransformMakeScale(1.1, 1.1);
    [UIView animateWithDuration: 0.4
                          delay: 0.0
                        options: UIViewAnimationOptionCurveEaseOut | UIViewAnimationOptionAutoreverse | UIViewAnimationOptionRepeat
                     animations: ^{
                         button.transform = CGAffineTransformIdentity;
                     } completion: ^(BOOL finished){
                         if (!animationOn) {
                             [UIView setAnimationRepeatCount: 0];
                         }
    }];
}
25
Luke

Le bloc d'achèvement ne sera appelé que lorsque l'animation est interrompue. Par exemple, il est appelé lorsque l'application va à l'arrière-plan et revient à nouveau au premier plan (via multitâche). Dans ce cas, l'animation est arrêtée. Vous devriez redémarrer l'animation lorsque cela se produit.

Pour arrêter l'animation, vous pouvez le supprimer de la couche de la vue:

[button.layer removeAllAnimations];
51
Tom van Zummeren

Vieille mais une autre option.

Vous pouvez également configurer une autre animation qui ne se répète pas sur la même vue, de cette façon, vous pouvez également la capturer dans l'état actuel et le renvoyer à l'option UIViewanimationOptionbeginfromCurrentState. Votre bloc d'achèvement est également appelé.

-(void)someEventSoStop
{
    button.transform = CGAffineTransformMakeScale(1.0, 1.0);
    [UIView animateWithDuration: 0.4
                          delay: 0.0
                        options: UIViewAnimationOptionCurveEaseOut | UIViewAnimationOptionBeginFromCurrentState
                     animations: ^{
                         button.transform = CGAffineTransformIdentity;
                     } completion: ^(BOOL finished){

                     }];
}
9
Recycled Steel

J'ai résolu le problème en appelant [button.layer removeAllAnimations].

2
Luke

Conformément à la documentation de la référence de la classe d'affichage: Si vous avez utilisé l'une des méthodes de classe telles que AnimateWithDaturation: Délai: Options: Animations: Achèvement : Si la durée est définie sur valeur négative ou à 0, les modifications sont fait sans animation. J'ai donc fait quelque chose comme ça pour arrêter l'animation infinie:

[UIView animateWithDuration:0.0 animations:^{
      button.layer.affineTransform = CGAffineTransformIdentity;
  }];

Je pense que c'est mieux que d'éliminer toutes les animations du calque comme dans la réponse suggérée. Notez que cela s'applique à toutes les autres méthodes d'animation de classe dans la classe UIView.

1
Wael Showair