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];
}
}];
}
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];
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){
}];
}
J'ai résolu le problème en appelant [button.layer removeAllAnimations]
.
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.