2009-07-22 8 views
23

Para mi comprensión, beginTime se puede usar para decir "hey, comience exactamente a las 12:00 en punto". Pero, ¿cómo podría decir esto con un tipo CFTimeInterval? Pensé que este no es más que una especie de valor "flotante" para especificar los segundos.¿Cómo especificar un beginTime para una animación usando CFTimeInterval?

¿O qué más sería la diferencia con la propiedad timeOffset que se especifica en el protocolo CAMediaTiming?

Respuesta

8

No, eso no es lo que beginTime hace. Especifica una hora de inicio relativa desde su animación principal (de forma predeterminada múltiples animaciones en un grupo disparan a la vez).

Desde el documentation:

Especifica el tiempo del receptor comienzan en relación con su objeto padre , en su caso.

timeOffset hace que comience a animarse en el cuadro que estaría en el tiempo offSet, y cuando llega al final, se mueve. En otras palabras, imagine que A, B, C, D, E son cuadros de animación, esto es lo que sucede en varios casos si establece beginTime o timeOffset en un valor igual a cuando golpea el cuadro C en el caso normal.

Normal  |A->B->C->D->E 
beginTime: |  A->B->C->D->E 
timeOffset: |C->D->E->A->B 
+1

El solo ajuste de timeOffset no retrasa la animación y cambia la hora inicial. Tu línea para 'timeOffset' es realmente lo que sucedería si configuras 'timeOffset' y 'beginTime' ... ¿verdad? –

+0

Estás en lo correcto, aclarando –

+3

Louis, ¿sabes si hay una manera de ejecutar solo una animación como: Parcial: | - - A-> B-> C, básicamente lo mismo que el caso de beginTime que mencionaste, pero ¿se detiene cuando llega al final en lugar de tener que dar vueltas? – pho0

52

Lo que me faltaba en la documentación: beginTime está en "animación núcleo tiempo absoluto", por lo que ha de obtener la hora actual y especifique su desplazamiento desde ese:

// Start in 5 seconds 
theAnimation.beginTime = CACurrentMediaTime()+5; 
+3

beginTime se especifica en el espacio de tiempo principal, no relativo al tiempo absoluto. – an0

+1

@ an0, obviamente, en mi caso, el espacio de tiempo padre es idéntico a CACurrentMediaTime(), por lo que funciona bien. ¿Cómo se referiría al espacio de tiempo de los padres? –

+0

Deberíamos usar la hora actual en el espacio de tiempo de la capa, el espacio de tiempo principal de la animación directamente agregado a la capa, como base. Si el beginTime de la capa se establece en un valor distinto de cero, su código no funcionará. Ver mi respuesta para los detalles. – an0

11

creo que la documentación de CAMediaTiming Protocol es muy malo. Time Warp in Animation es una explicación completa (re-documentación) de todas las propiedades de CAMediaTiming Protocol.

13

Primero tiene que convertir en tiempo-espacio de la capa, así:

let currentLayerTime = myLayer.convertTime(CACurrentMediaTime(), fromLayer: nil) 

entonces se puede establecer la relación con beginTime hora actual de la capa. Por ejemplo, para hacer una animación comienza en 2s:

myAnimation.beginTime = currentLayerTime + 2 

También probable que desee para establecer el 'FILLMODE' al revés, de manera que se puede establecer el valor de la propiedad final antes de agregar la animación:

myAnimation.fillMode = kCAFillModeBackwards 
myLayer.someProperty = someFinalValue 
myLayer.addAnimation(myAnimation, forKey: "myAnimationName") 
Cuestiones relacionadas