2013-03-03 12 views
28

Mam animację CAKeyframeAnimation, którą chciałbym powtórzyć na zawsze, używając repeatCount = HUGE_VALF. Czas trwania animacji to 2 sekundy, ale chciałbym mieć 3-sekundową przerwę przed każdym cyklem.Opóźnienie CAKeyframeAnimation przed powtórzeniem

Jedynymi 2 sposoby mogę myśleć robi, które:

  1. aby cały animacja ostatnie 5 sekund i dodać dodatkowe keyTimes i wartości, tak aby uzyskać pauzę szukam podczas ostatniego 3s z animacji 5s. To wydaje się trochę hacky.

  2. Animację należy powtórzyć tylko raz, a następnie dodać coś w rodzaju performSelector:afterDelay:2, aby ponownie uruchomić animację i tak dalej. To też jest brudne. Oznaczałoby to również, że muszę dzwonić pod numer addAnimation: co 5 sekund, co do których nie jestem pewien, jest optymalny pod względem wydajności.

Czy istnieje inna opcja, której może mi brakować? Czy jedna z tych 2 metod jest lepsza od drugiej?

Odpowiedz

110

Po zrzuceniu animacji z Apple MKUserLocationView, mogłem zobaczyć, jak to robili. Okazuje się, że właśnie do tego służy CAAnimationGroup. Przez umieszczenie animacji 2 sekundy do 5 sekund grupy animacji, będziesz skończyć z animacją 2 sekundy, a następnie przez 3 sekundy opóźnienia: Odpowiedź

CAAnimationGroup *animationGroup = [CAAnimationGroup animation]; 
animationGroup.duration = 5; 
animationGroup.repeatCount = INFINITY; 

CAMediaTimingFunction *easeOut = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut]; 

CABasicAnimation *pulseAnimation = [CABasicAnimation animationWithKeyPath:@"transform.scale.xy"]; 
pulseAnimation.fromValue = @0.0; 
pulseAnimation.toValue = @1.0; 
pulseAnimation.duration = 2; 
pulseAnimation.timingFunction = easeOut; 

animationGroup.animations = @[pulseAnimation]; 

[ringImageView.layer addAnimation:animationGroup forKey:@"pulse"]; 
+0

Clever rozwiązanie. Ładne i czyste. Powinieneś zaakceptować własną odpowiedź. ;-) –

+1

Bardzo pomocna. Huhu. –

+0

Wooh .. Dziękuję za to sir .. działa idealnie aż do teraz .. :) – 0yeoj

4

samvermette w Swift 3:

let animationGroup = CAAnimationGroup() 
animationGroup.duration = 5; 
animationGroup.repeatCount = .infinity 

let easeOut = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseOut) 

let pulseAnimation = CABasicAnimation(keyPath: "transform.scale.xy") 
pulseAnimation.fromValue = 0 
pulseAnimation.toValue = 1.0 
pulseAnimation.duration = 2 
pulseAnimation.timingFunction = easeOut 

animationGroup.animations = [pulseAnimation] 

ringImageView.layer.add(animationGroup, forKey: "pulse") 
Powiązane problemy