2013-02-01 11 views
6

Ich habe ein Ballbild, das ich um einen Pfad animiere. Die Animation wird so eingestellt, dass sie sich für immer wiederholt, aber warum gibt es eine Verzögerung zwischen Wiederholungen?CAKeyFrameAnimation Verzögerungen vor dem Wiederholen

Hier ist mein Code:

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); 

Antwort

9

Versuchen Sie folgendes:

[animation setCalculationMode:kCAAnimationPaced] 
+0

Ja, das funktioniert wie ein Zauber! Vielen Dank! –

+0

Habe eine Stunde damit verbracht, das herauszufinden ... Warum sollte das nicht der Standard sein ?! – cph2117

0

Sie kCAFillModeRemoved mit kCAFillModeForwards oder einem anderen Wert ersetzt werden muss. Lesen Sie die Dokumentation on why.

Zusätzlich:

ersetzen:

[arcAnimation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear]] 

mit (je nach Testergebnis):

[arcAnimation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn]] 

oder

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

Nirav, ich möchte auf jeden Fall nicht in oder out erleichtern. Ich möchte, dass die Animation mit konstanter Geschwindigkeit durch den Kreis läuft, ohne zu beschleunigen oder zu verlangsamen. Ich habe alle verschiedenen Füllmodi ausprobiert, keiner hat einen merklichen Effekt auf die Animation. Die Animation pausiert noch kurz am Ende, bevor sie erneut startet. –

+0

Dann denke ich, es ist der Aufruf setBeginTime, der dieses Ding erstellt. Da Sie einen Anruf tätigen, dauert es einige Zeit, um die Sekunde zu bewerten, die es beginnen sollte, was für die Verzögerung verantwortlich ist. Versuchen Sie es zu entfernen. –

+0

Ich habe es entfernt. Verhält sich immer noch genau gleich. –

1

Ich weiß nicht, die tatsächliche antwort, aber du machst es eine Menge unnötiger Dinge hier, und mein Vorschlag wäre, dass Sie damit beginnen, es zu entfernen. Der CATransaction-Block (begin und commit) ist nicht erforderlich. Es gibt keine Notwendigkeit für setBeginTime:. Es ist definitiv nicht notwendig removedOnCompletion und fillMode einzustellen, da dies keine gruppierte Animation ist. Fügen Sie einfach die Animation zur Ebene hinzu und treten Sie zurück. Es wird sofort starten und wird für immer wiederholen, und Ihr Code wird einfacher und besser sein.