2017-05-02 4 views
0

Les détails:animation Bizarre avec UIDynamics temporisées

  • J'utilise DispatchQueue.main.asyncAfter(deadline: ... mettre à jour le snapPoint d'un UISnapBehavior, ce qui provoque la vue associée au comportement de pression pour casser (avec animation) à la nouvelle point d'accrochage
  • Je veux mettre à jour les snapPoint de trois vues circulaires empilées les unes sur les autres. Je veux mettre à jour le snapPoint de chaque consécutivement. En d'autres termes, je veux que la vue A commence à animer en position à t0, la vue B commence à animer à t1, et la vue C commence à animer à t2.

Le problème:

Le calendrier des animations est bizarre. Par exemple:

  • Si la différence entre t0, t1 et t2 est de 100 millisecondes, ils s'accrochent tous à leurs points d'accrochage respectifs exactement au même moment.
  • Toutefois, si la différence entre t0, t1 et t2 est de 200 millisecondes, affichez A et affichez l'accrochage B à leurs positions respectives en même temps, mais affichez les accrochages C sur son nouveau point d'accrochage à un moment totalement différent. que les deux premiers.
  • Encore plus bizarre, si la différence entre t0, t1 et t2 atteint 400 millisecondes, la vue A s'anime tout seul et les vues B et C s'animent ensemble.
  • Enfin, si la différence atteint 500 millisecondes, chaque vue s'anime à une heure différente.

Que se passe-t-il ici?

enter image description here

Répondre

0

En utilisant Timer (Swift) ou NSTimer (Objective-C) au lieu de GCD (Grand Central Dispatch) me permet de faire ces retards nuancés dans les animations avec le comportement attendu.

enter image description here

Cependant, je ne sais pas pourquoi cela fonctionne. J'apprécie grandement les explications sur ce qui se passe sous le capot ou s'il est possible d'obtenir le même effet avec GCD.

+0

'dispatchAfter' fait exactement cela; expédition * après * un certain délai, le délai réel peut être plus long, mais il ne sera pas plus court. Le délai réel dépend de ce que le système décide de faire. – Paulw11

+0

C'est exactement ce que ... théoriquement. Si vous répétez les étapes ci-dessus avec des valeurs d'environ 100 millisecondes (0,1 seconde), tout se passe exactement au même moment. Si vous exécutez le même code avec une minuterie, l'animation se déroule comme prévu. Je ne sais pas pourquoi, mais c'est ce qui se passe en dépit de ce à quoi on pourrait s'attendre. – josephap

+0

C'est la différence entre dire "Venez me voir * à * 4 heures" vs "Venez me voir * après * 4 heures". Dans le premier cas, je suis censé être là juste sur 4. Dans le second cas, 4:15 est OK. – Paulw11