UIViewPropertyAnimator comportement différent sur iOS10 et iOS11 inversion d'une animation. Bug sur les propriétés `isReversed` et` fractionComplete`?

LE PROBLÈME
En exécutant le même code sur iOS10 et iOS11, mon UIViewPropertyAnimator a un comportement différent juste après avoir changé sa propriété .isReversed .

Tout est ok sur iOS10. Le problème d'animation se produit sur iOS11

CONDITIONS
C'est vrai pour toutes les animations, pas seulement pour une animation particulière, et elle est vérifiable à la fois en regardant l'animation et dans le code. Cela arrive à la fois sur des simulateurs et sur de vrais appareils.

DÉTAILS
Une fois créé un UIViewPropertyAnimator avec son animation, pendant son exécution, j'appelle simplement .pauseAnimation() et change la propriété .isReversed en true . Après cela, je reprends l'appel de l'animation:

 continueAnimation(withTimingParameters parameters: UITimingCurveProvider?, durationFactor: CGFloat) 

à ce stade sur iOS10 l'animation change doucement son couplet, sur iOS11 il s'arrête immédiatement et s'inverse avec un peu de retard des trames.

Si dans le code je vérifie la valeur de .fractionComplete (appelé sur mon object UIViewPropertyAnimator il me rend l'achèvement de l'animation dans sa valeur de pourcentage, à partir de 0.0 et se terminant à 1.0) juste après .continueAnimation(...

– Sur iOS 10 il rest quelques instants comme si l'animation continue et seulement après quelques fractions de time saute à son complémentaire.

– Sur iOS 11 il saute brusquement sur son complémentaire

Sur la documentation il y a des mises à jour non liées à ceci, juste quelques nouvelles propriétés pour le UIViewPropertyAnimator mais pas utilisées parce que je vise iOS10

Pourrait être un bug ou il me manque quelque chose?


Petite mise à jour : juste testé, même comportement sur iOS 11.0.1 et sur iOS 11.1 beta1

Comme lié dans le commentaire, cela se produit uniquement avec une courbe non-linéaire!

Je me suis battu pendant un bon moment, mais j'ai remarqué la propriété scrubsLinearly qui a été ajoutée à UIViewPropertyAnimator dans iOS 11:

Par défaut à true. Permet à un animateur de faire une pause et de scruter linéairement ou en utilisant le timing actuel de l'animateur.

Notez que la valeur par défaut de cette propriété est true , ce qui semble provoquer un conflit avec l'utilisation d'une courbe d'animation non linéaire. Cela pourrait également expliquer pourquoi le problème n'est pas présent lors de l'utilisation d'une fonction de synchronisation linéaire.

Définir scrubsLinearly sur false , l'animation semble fonctionner comme prévu:

 let animator = UIViewPropertyAnimator(duration: 0.25, curve: .easeOut) { ... } animator.scrubsLinearly = false