2013-02-01 20 views
6

Mam obraz kuli, który animuję wokół ścieżki. Animacja ma powtarzać się na zawsze, ale dlaczego między powtórzeniami występuje opóźnienie?Opóźnienia CAKeyFrameAnimation przed powtórzeniem

Oto mój kod:

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

Odpowiedz

9

Spróbuj tego:

[animation setCalculationMode:kCAAnimationPaced] 
+0

Tak, działa to jak urok! Dzięki! –

+0

Spędziłem godzinę, próbując to rozgryźć ... Dlaczego to nie byłoby domyślne ?! – cph2117

0

Musisz wymienić kCAFillModeRemoved z kCAFillModeForwards lub inną wartością. Przeczytaj dokumentację on why.

Dodatkowo:

Wymienić:

[arcAnimation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear]] 

Z (w zależności od wyniku testu):

[arcAnimation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn]] 

lub

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

Nirav, zdecydowanie nie chce złagodzić lub pomniejszyć. Chcę, aby animacja poruszała się ze stałą prędkością przez okrąg bez przyspieszania lub zwalniania. Wypróbowałem wszystkie różne tryby wypełniania, żaden nie ma zauważalnego wpływu na animację. Animacja zatrzymuje się jeszcze na chwilę przed ponownym rozpoczęciem. –

+0

Następnie myślę, że jest to wywołanie setBeginTime, które to tworzy. Odkąd zadzwonisz, potrzeba trochę czasu, aby ocenić, kiedy ma się rozpocząć, co oznacza opóźnienie. Spróbuj go usunąć. –

+0

Usunąłem go. Nadal zachowuje się dokładnie tak samo. –

1

Nie wiem rzeczywiste odpowiedź, ale robisz wiele niepotrzebnych rzeczy tutaj, a moją sugestią byłoby, że zaczniesz od usunięcia go. Nie ma potrzeby bloku CATransaction (begin i commit). Nie ma potrzeby dla setBeginTime:. Z pewnością nie ma potrzeby ustawiania removedOnCompletion i fillMode, ponieważ nie jest to zgrupowana animacja. Po prostu dodaj animację do warstwy i cofnij się. Rozpocznie się natychmiast i będzie powtarzać na zawsze, a twój kod będzie prostszy i lepszy.