2012-06-26 12 views
5

En mi aplicación estoy usando CABasicAnimation para la animación. Quiero cambiar la velocidad de la animación dinámicamente, así que he agregado un control deslizante para cambiar la velocidad. A continuación está mi código de animación. Pero no puedo cambiar la velocidad, cuando cambio el valor de la velocidad no pasa nada.Cómo cambiar la velocidad durante la animación CABasicAnimation

 CABasicAnimation * a = [CABasicAnimation animationWithKeyPath:@"position"]; 
    [a setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear]]; 

    CGPoint startPt = CGPointMake(self.view.bounds.size.width + displayLabel.bounds.size.width/2, 
            displayLabel.frame.origin.y); 
    CGPoint endPt = CGPointMake(displayLabel.bounds.size.width/-2, displayLabel.frame.origin.y); 

    [a setFromValue:[NSValue valueWithCGPoint:startPt]]; 
    [a setToValue:[NSValue valueWithCGPoint:endPt]]; 
    [a setAutoreverses:NO]; 
    [a setDuration:speeds]; 
    [a setRepeatCount:HUGE_VAL]; 
    [displayLabel.layer addAnimation:a forKey:@"rotationAnimation"]; 


    - (IBAction)speedSlider:(id)sender { 

     speeds = slider.value; 

    } 
+0

Posible duplicado de [Cambiar duración (velocidad) en una animación en ejecución] (https://stackoverflow.com/questions/21589483/change-duration-speed-on-a-running-animation) – Fattie

+0

** Solución completa para 2017 ** ...https://stackoverflow.com/a/45787919/294884, phew – Fattie

Respuesta

0

establece la velocidad como lo que necesita.

a.duration=0.5; 

Prueba esto ...

+0

Quiero velocidad dinámica basada en el valor del control deslizante. La animación está completamente bien para valores estáticos –

2

EDIT: Parece que va a tener un problema adicional, sin embargo: no lo hace look like puede cambiar los valores por el estilo en una animación en ejecución. Deberá eliminar la animación actual y agregar una nueva con el valor alterado. Esto puede necesitar un poco de cuidado para evitar un efecto discordante cuando agrega la nueva animación.

En el subproceso anterior, puede hacer esto al no repetir la animación, pero utilizando un delegado (see here) para seguir volviendo a agregar la animación y establecer la nueva velocidad para el siguiente ciclo de animación.

Original post:

Está cambiando el valor que había pasado originalmente en la animación. Esto no va a afectar la animación en ejecución. Deberá obtener una referencia a eso y cambiar la propiedad de duración del objeto de animación. Algo como esto en su método de acción:

CABasicAnimation *a = [displayLabel.layer animationForKey:@"rotationAnimation"]; 
a.duration = slider.value; 
+0

No ocurre nada desde el código anterior. –

+0

Lo he investigado un poco más y no puede cambiar el valor de una animación en ejecución. Ver mi edición – jrturton

+0

he aquí cómo se hace una ** animación reiniciable ** estos días en iOS ... https://stackoverflow.com/a/45787919/294884 – Fattie

1

Creo que jrturton tiene razón en que no puede cambiar las propiedades de una animación que ya se está ejecutando. Pero lo que podrías hacer es dividir la animación en segmentos cortos y cambiar la velocidad para el siguiente segmento cuando cambie el valor del control deslizante.

En lugar de animar del punto A al punto D, animarías desde A-B, luego B-C, luego C-D. Use el elemento animationDidStop de la clase principal para verificar el punto actual, verificar el valor del control deslizante y comenzar la siguiente animación.

Esto podría producir movimientos bruscos, pero si utiliza segmentos muy pequeños, es posible que pueda suavizarlos.

1

u debe detener la animación y reiniciar un nuevo con un nuevo espacio de tiempo

pero recuerda que entrar por la fromValue y la toValue, y utilizar el viejo toValue como el nuevo fromValue para llevar a cabo un cambio sin problemas

6

creo que la mejor manera de cambiar la velocidad es el cambio del sistema de tiempo de su capa

displayLabel.layer.timeOffset = 
    [displayLabel.layer convertTime:CACurrentMediaTime() fromLayer:nil]; 
displayLabel.layer.beginTime = CACurrentMediaTime(); 
displayLabel.layer.speed= slider.value; 

esto se puede ver de antemano. https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CoreAnimation_guide/AdvancedAnimationTricks/AdvancedAnimationTricks.html#//apple_ref/doc/uid/TP40004514-CH8-SW2

+0

esto no funciona; eso no está relacionado. – Fattie

+0

@Fattie - probablemente estés buscando algo diferente. Esta es la respuesta exacta y precisa para el problema. Me funciona muy bien. –

+0

Entiendo lo que quiere decir @LesNie - y sí, proporcionaría una solución en algunas situaciones. Sin embargo, cambia la escala de tiempo para toda la capa. Necesitar cambiar las propiedades de una animación en ejecución es un problema común (y molestamente difícil en iOS). Hice clic en "+1" en su respuesta :) ¡Feliz año nuevo! – Fattie

Cuestiones relacionadas