Pregunta UIViewPropertyAnimator comportamiento diferente en iOS10 e iOS11 invirtiendo una animación. ¿Error en las propiedades `isReversed` y` fractionComplete`?


EL PROBLEMA
Al ejecutar el mismo código en iOS10 e iOS11 mi UIViewPropertyAnimator tiene un comportamiento diferente justo después de cambiar su .isReversed propiedad.

Todo está bien en iOS10. El problema de animación ocurre en iOS11

CONDICIONES
Es cierto para cualquier animación, no solo para una en particular, y es verificable tanto al mirar la animación como dentro del código. Sucede tanto en simuladores como en dispositivos reales.

DETALLES
Una vez creado un UIViewPropertyAnimator con su animación, durante su ejecución acabo de llamar .pauseAnimation() y cambiar el .isReversed propiedad a cierto. Después de eso, reanudo la llamada de animación:

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

en este punto en iOS10 la animación cambia suavemente su verso, en iOS11 se detiene inmediatamente y se revierte con un retraso de fotogramas.

Si en el código verifico el valor de .fractionComplete (llamado en mi objeto UIViewPropertyAnimator me devuelve la finalización de la animación en su valor de porcentaje, comenzando desde 0.0 y terminando en 1.0) justo después de .continueAnimation(...

- En iOS 10 permanece por unos momentos como si la animación continúa y solo después de que algunas fracciones de tiempo saltan a su complemento.

- En iOS 11 salta de repente en su complementario


En la documentación, no hay actualizaciones relacionadas con esto, solo un par de propiedades nuevas para el UIViewPropertyAnimator pero no se usan porque me estoy dirigiendo a iOS10

¿Podría ser un error o me estoy perdiendo algo?


Pequeña actualización: acaba de probar, el mismo comportamiento en iOS 11.0.1 y en iOS 11.1 beta1

Como se relaciona en el comentario, ¡esto solo ocurre con una curva no lineal!


10
2017-09-25 13:39


origen


Respuestas:


He estado luchando contra esto durante bastante tiempo también, pero luego noté la scrubsLinearly propiedad que se agregó a UIViewPropertyAnimator en iOS 11:

El valor predeterminado es verdadero. Brinda la capacidad para que un animador haga una pausa y restriegue de forma lineal o usando la sincronización actual del animador.

Tenga en cuenta que el valor predeterminado de esta propiedad es true, lo que parece causar un conflicto con el uso de una curva de animación no lineal. Eso también podría explicar por qué el problema no está presente cuando se usa una función de tiempo lineal.

Ajuste scrubsLinearly a false, el animador parece funcionar como se esperaba:

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

6
2017-11-10 12:57



  1. En iOS 11, fractionComplete se invertirá (es decir, 1 - originalFractionComplete) después de invertir la animación por animator.isReversed = true.

  2. La animación de primavera que tiene menos de 0.1 s de duración se completará instantáneamente.

Entonces, originalmente querrás que la animación invertida ejecute el 90% de toda la duración de la animación, pero en iOS 11, la animación invertida en realidad tiene una duración del 10% porque isReversed cambiado, y esa 10% de duración es menos de 0.1 s, por lo que la animación se completará instantáneamente y parece que no se produjo ninguna animación.

¿Como arreglar?

Para iOS 10, compatibilidad con versiones anteriores, copie fractionComplete valor antes de invertir la animación y usarla para continueAnimation.

p.ej.

let fraction = animator.fractionComplete
animator.isReversed = true
animator.continueAnimation(...*fraction*...)

1
2017-12-21 08:23