2013-02-01 14 views
6

Ho un'immagine di palla che sto animando attorno a un percorso. L'animazione è impostata per essere ripetuta per sempre, ma perché c'è un ritardo tra le ripetizioni?CAKeyFrameTimoli di annullamento prima di ripetere

Ecco il mio codice:

CGPathRef aPath; 
aPath = CGPathCreateWithEllipseInRect(CGRectMake(0, 0, SIZE, SIZE), NULL); 

[CATransaction begin]; 

arcAnimation = [CAKeyframeAnimation animationWithKeyPath: @"position"]; 
[arcAnimation setBeginTime:CACurrentMediaTime()]; 
[arcAnimation setDuration: 1.5]; 
[arcAnimation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear]]; 
[arcAnimation setAutoreverses: NO]; 
[arcAnimation setRepeatCount:HUGE_VALF]; 
arcAnimation.removedOnCompletion = NO; 
arcAnimation.fillMode = kCAFillModeRemoved; 
[arcAnimation setPath: aPath]; 
[ball.layer addAnimation: arcAnimation forKey: @"position"]; 
[CATransaction commit]; 
CFRelease(aPath); 

risposta

9

Prova questo:

[animation setCalculationMode:kCAAnimationPaced] 
+0

Sì, funziona come un fascino! Grazie! –

+0

Ho passato un'ora cercando di capirlo ... Perché non dovrebbe essere il default ?! – cph2117

0

È necessario sostituire kCAFillModeRemoved con kCAFillModeForwards o un altro valore. Leggere la documentazione on why.

Inoltre:

Sostituire:

[arcAnimation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear]] 

Con (a seconda del risultato di prova):

[arcAnimation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn]] 

o

[arcAnimation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut]] 
+0

Nirav, io sicuramente non voglio facilitare dentro o fuori. Voglio che l'animazione funzioni a velocità costante attraverso il cerchio senza accelerare o rallentare. Ho provato tutte le diverse modalità di riempimento, nessuna ha alcun effetto notevole sull'animazione. L'animazione si ferma ancora per un momento alla fine prima di ricominciare. –

+0

Quindi penso che sia la chiamata setBeginTime a creare questa cosa. Dal momento che si effettua una chiamata, è necessario del tempo per valutare il secondo avvio, che tiene conto del ritardo. Prova a rimuoverlo. –

+0

L'ho rimosso. Si comporta ancora esattamente allo stesso modo. –

1

non so il reale rispondi, ma lo stai facendo un sacco di cose inutili qui, e il mio suggerimento sarebbe che si inizia rimuovendolo. Non è necessario il blocco CATransaction (begin e commit). Non è necessario per setBeginTime:. Non è assolutamente necessario impostare removedOnCompletion e fillMode, poiché non si tratta di un'animazione raggruppata. Basta aggiungere l'animazione al livello e tornare indietro. Comincerà immediatamente e si ripeterà per sempre, e il tuo codice sarà più semplice e migliore.

Problemi correlati