2012-06-26 2 views
5

Nella mia applicazione sto usando CABasicAnimation per l'animazione. Voglio cambiare la velocità dell'animazione in modo dinamico così ho aggiunto un cursore per cambiare la velocità. Di seguito è riportato il mio codice di animazione. Ma non sono in grado di cambiare la velocità, quando cambio il valore della velocità non succede nulla.Come modificare la velocità durante l'animazione 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

Possibile duplicato di [Modifica durata (velocità) su un'animazione in esecuzione] (https://stackoverflow.com/questions/21589483/change-duration-speed-on-a-running-animation) – Fattie

+0

** Soluzione completa per il 2017 ** ...https://stackoverflow.com/a/45787919/294884, phew – Fattie

risposta

0

impostare la velocità come quello che ti serve.

a.duration=0.5; 

Prova questo ...

+0

Voglio velocità dinamica in base al valore del cursore. L'animazione è completamente a posto per i valori statici –

2

EDIT: Sembra che si avrà un ulteriore problema, però: non look like è possibile modificare i valori del genere su un'animazione in esecuzione. Dovrai rimuovere l'animazione corrente e aggiungerne una nuova con il valore modificato. Potrebbe essere necessario un po 'di attenzione per evitare un effetto di storta quando si aggiunge la nuova animazione.

Dalla discussione precedente, è possibile eseguire questa operazione non ripetendo l'animazione, ma utilizzando un delegato (see here) per continuare ad aggiungere nuovamente l'animazione e impostare la nuova velocità per il ciclo di animazione successivo.

Original post:

si sta modificando il valore che aveva inizialmente approvato per l'animazione. Questo non influenzerà l'animazione in esecuzione. Dovrai ottenere un riferimento e modificare la proprietà duration dell'oggetto animato. Qualcosa di simile a questo nel vostro metodo di azione:

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

Non succede niente dal codice precedente. –

+0

L'ho esaminato un po 'di più e non è possibile modificare il valore di un'animazione in esecuzione. Vedi la mia modifica – jrturton

+0

ecco come si effettua ** un'animazione riavviabile ** al giorno d'oggi in iOS .. https://stackoverflow.com/a/45787919/294884 – Fattie

1

Penso che jrturton sia corretto che non è possibile modificare le proprietà su un'animazione già in esecuzione. Ma quello che potresti fare è spezzare l'animazione in segmenti brevi e cambiare la velocità per il segmento successivo quando il valore del cursore cambia.

Invece di animare dal punto A al punto D, devi animare da A-B, poi B-C, poi C-D. Usa l'animazione della classe genitoreDidStop per controllare il punto corrente, controlla il valore del cursore e avvia l'animazione successiva.

Questo potrebbe produrre movimento a scatti, ma se si utilizzano segmenti molto piccoli, si potrebbe essere in grado di appianare.

1

u dovrebbe interrompere l'animazione e riavviare una nuova con una nuova durata

ma ricordatevi di accedere lungo il fromValue e la toValue, e utilizzare il vecchio toValue come il nuovo fromValue per effettuare un cambiamento senza soluzione di continuità

6

Penso che il modo migliore per cambiare la velocità è cambiare il sistema il tempo del vostro strato

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

si può vedere questo per anticipo. https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CoreAnimation_guide/AdvancedAnimationTricks/AdvancedAnimationTricks.html#//apple_ref/doc/uid/TP40004514-CH8-SW2

+0

questo non funziona; questo non è correlato – Fattie

+0

@Fattie - probabilmente stai cercando qualcosa di diverso. Questa è la risposta esatta e precisa al problema. Funziona per me magnificamente. –

+0

Capisco cosa intendi @LesNie - e sì, fornirebbe una soluzione in alcune situazioni. Tuttavia, cambia la scala temporale per l'intero livello. La necessità di modificare le proprietà di un'animazione in esecuzione è un problema comune (e fastidiosamente difficile in iOS). Ho fatto clic su "+1" sulla risposta :) Buon anno! – Fattie