Est-il possible d'annuler une UIView
animation en cours? Ou devrais-je passer au niveau CA?
c'est-à-dire que j'ai fait quelque chose comme ça (peut-être en définissant une action d'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 ne se termine et que j'obtienne l'événement de fin d'animation, je veux l'annuler (couper court). Est-ce possible? Googler autour trouve quelques personnes posant la même question sans réponses - et une ou deux personnes spéculant que cela ne peut pas être fait.
ios
core-animation
uiviewanimation
philsquared
la source
la source
Réponses:
La façon dont je le fais est de créer une nouvelle animation à votre point final. Définissez une durée très courte et assurez-vous d'utiliser la
+setAnimationBeginsFromCurrentState:
méthode pour démarrer à partir de l'état actuel. Lorsque vous le définissez sur OUI, l'animation actuelle est raccourcie. Ressemble à ceci:la source
setAnimationBeginsFromCurrentState:
est déconseillée à partir d'iOS 4, mais elle est toujours là et devrait toujours fonctionner.Utilisation:
la source
La manière la plus simple d'arrêter immédiatement toutes les animations sur une vue particulière est la suivante:
Reliez le projet à QuartzCore.framework. Au début de votre code:
Maintenant, lorsque vous voulez arrêter toutes les animations sur une vue morte sur leurs traces, dites ceci:
La ligne médiane fonctionnerait toute seule, mais il y a un délai jusqu'à la fin de la boucle d'exécution (le "moment de redessin"). Pour éviter ce délai, encapsulez la commande dans un bloc de transaction explicite, comme indiqué. Cela fonctionne à condition qu'aucune autre modification n'ait été effectuée sur cette couche dans la boucle d'exécution actuelle.
la source
removeAllAnimations
aura pour effet secondaire de ramener l'animation à sa dernière image, plutôt que de l'arrêter là où elle se trouve actuellement.Sur iOS 4 et supérieur, utilisez l'
UIViewAnimationOptionBeginFromCurrentState
option sur la deuxième animation pour raccourcir la première animation.Par exemple, supposons que vous ayez une vue avec un indicateur d'activité. Vous souhaitez faire apparaître progressivement l'indicateur d'activité pendant le début d'une activité potentiellement longue et le faire disparaître lorsque l'activité est terminée. Dans le code ci-dessous, la vue avec l'indicateur d'activité est appelée
activityView
.la source
Pour annuler une animation, il vous suffit de définir la propriété en cours d'animation, en dehors de l'animation UIView. Cela arrêtera l'animation où qu'elle soit et l'UIView passera au paramètre que vous venez de définir.
la source
-animationDidStop:finished:context:
sert l' argument «fini» . Si[finished boolValue] == NO
, alors vous savez que votre animation a été en quelque sorte annulée.Désolé de ressusciter cette réponse, mais dans iOS 10, les choses ont un peu changé, et maintenant l'annulation est possible et vous pouvez même annuler gracieusement!
Après iOS 10, vous pouvez annuler des animations avec UIViewPropertyAnimator !
Si vous passez vrai, il annule l'animation et s'arrête là où vous l'avez annulée. La méthode d'achèvement ne sera pas appelée. Cependant, si vous passez false, vous êtes responsable de terminer l'animation:
Vous pouvez terminer votre animation et rester dans l'état actuel (.current) ou passer à l'état initial (.start) ou à l'état final (.end)
Au fait, vous pouvez même mettre en pause et redémarrer plus tard ...
Remarque: Si vous ne voulez pas une annulation brusque, vous pouvez inverser votre animation ou même changer votre animation après l'avoir mise en pause!
la source
Si vous animez une contrainte en modifiant la constante au lieu d'une propriété de vue, aucune des autres méthodes ne fonctionne sur iOS 8.
Exemple d'animation:
Solution:
Vous devez supprimer les animations des calques de toutes les vues affectées par le changement de contrainte et leurs sous-couches.
la source
self.constraintView.layer.removeAllAnimations()
Si vous souhaitez simplement suspendre / arrêter l'animation en douceur
Source: comment suspendre l'animation d'un arbre de calque
la source
Rien de tout cela ne l'a résolu pour moi, mais cela a aidé: l'
UIView
animation définit immédiatement la propriété, puis l'anime. Il arrête l'animation lorsque la couche de présentation correspond au modèle (la propriété set).J'ai résolu mon problème, qui était "Je veux animer à partir de l'endroit où vous avez l'air d'apparaître" ("vous" signifiant la vue). Si vous voulez CELA, alors:
CALayer * pLayer = theView.layer.presentationLayer;
définir la position sur la couche de présentation
J'utilise quelques options dont
UIViewAnimationOptionOverrideInheritedDuration
Mais parce que la documentation d'Apple est vague, je ne sais pas si elle remplace vraiment les autres animations lorsqu'elles sont utilisées, ou réinitialise simplement les temporisateurs.
Et cela devrait être une solution décente pour l'instant.
la source
la source
Version rapide de la solution de Stephen Darlington
la source
J'ai le même problème; les API n'ont rien pour annuler une animation spécifique. le
+ (void)setAnimationsEnabled:(BOOL)enabled
désactive TOUTES les animations et ne fonctionne donc pas pour moi. Il y a deux solutions:
1) faites de votre objet animé une sous-vue. Ensuite, lorsque vous souhaitez annuler les animations de cette vue, supprimez la vue ou masquez-la. Très simple, mais vous devez recréer la sous-vue sans animations si vous devez la garder en vue.
2) répétez l'anim un seul, et faites un sélecteur de délégué pour redémarrer l'anim si nécessaire, comme ceci:
Le problème avec 2) est qu'il y a toujours un délai d'arrêt de l'animation à la fin du cycle d'animation en cours.
J'espère que cela t'aides.
la source
Même si vous annulez l'animation de la manière ci-dessus, l'animation
didStopSelector
s'exécute toujours. Donc, si vous avez des états logiques dans votre application piloté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 contexte desUIView
animations. Si vous transmettez l'état actuel de votre programme par le paramètre de contexte à l'animation, lorsque l'animation s'arrête, votredidStopSelector
fonction peut décider si elle doit faire quelque chose ou simplement revenir en fonction de l'état actuel et de la valeur d'état transmise en tant que contexte.la source
la source
Pour suspendre une animation sans rétablir l'état d'origine ou final:
la source
Lorsque je travaille avec l'
UIStackView
animation,removeAllAnimations()
je dois en outre définir certaines valeurs à l'initiale, car jeremoveAllAnimations()
peux les définir dans un état imprévisible. J'aistackView
avecview1
et à l'view2
intérieur, et une vue doit être visible et une cachée:la source
Aucune des solutions répondues n'a fonctionné pour moi. J'ai résolu mes problèmes de cette façon (je ne sais pas si c'est une bonne façon?), Car j'ai eu des problèmes lors de l'appel trop rapide (lorsque l'animation précédente n'était pas encore terminée). Je passe mon animation souhaitée avec le bloc customAnim .
la source