¿Cómo crear una función de aceleración personalizada con Core Animation?

Estoy animando unCALayer a lo largo de unCGPath (QuadCurve) bastante bien en iOS. Pero me gustaría usar una función de relajación más interesante que las pocasprevist por Apple (EaseIn / EaseOut, etc.). Por ejemplo, un rebote o una función elástica.

stas cosas se pueden hacer con MediaTimingFunction (bezier):

Pero me gustaría crear funciones de tiempo que son más complejas. El problema es que, en el medio, un momento parece requerir un bezier cúbico que no es lo suficientemente poderoso como para crear estos efectos:

http: //wiki.sparrow-framework.org/_media/manual/transitions.pn

Loscódig crear lo anterior es bastante simple en otros marcos, lo que hace que esto sea muy frustrante. Tenga en cuenta que las curvas están asignando el tiempo de entrada al tiempo de salida (curva T-t) y no las curvas de posición de tiempo. Por ejemplo,easeOutBounce (T) = t devuelve una nuevat. Entonces esot se usa para trazar el movimiento (o cualquier propiedad que debamos animar).

Entonces, me gustaría crear una compleja @ personalizaCAMediaTimingFunction pero no tengo idea de cómo hacerlo, o si es posible? ¿Hay alguna alternativa?

EDITAR

Aquí hay un ejemplo concreto de pasos. Muy educativo:)

Quiero animar un objeto a lo largo de una línea desde el puntoa ab, pero quiero que "rebote" su movimiento a lo largo de la línea usando la curva de facilidad de rebote anterior. Esto significa que seguirá la línea exacta desdea ab, pero acelerará y desacelerará de una manera más compleja de lo que es posible utilizando la función CAMediaTimingFunction actual basada en Bézier.

Deja que esa línea sea cualquier movimiento de curva arbitrario especificado con CGPath. Todavía debe moverse a lo largo de esa curva, pero debe acelerar y desacelerar de la misma manera que en el ejemplo de línea.

En teoría, creo que debería funcionar así:

Describamos la curva de movimiento como una animación de fotogramas clavemove (t) = p, dóndet es el tiempo [0..1],p es la posición calculada en el momentot. Asi quemove (0) devuelve la posición al comienzo de la curva,move (0.5) el medio exacto ymove (1) al final. Usando una función de sincronizacióntime (T) = t para proporcionar elt valores paramovimient debería darme lo que quiero. Para un efecto de rebote, la función de temporización debe devolver la mismat valores paratime (0.8) ytime (0.8) (solo un ejemplo). Simplemente reemplace la función de sincronización para obtener un efecto diferente.

(Sí, es posible hacer un salto de línea creando y uniendo cuatro segmentos de línea que van y vienen, pero eso no debería ser necesario. Después de todo, es solo una función lineal simple que asignahor valores a posiciones.)

Espero tener sentido aquí.

Respuestas a la pregunta(7)

Su respuesta a la pregunta