2013-03-03 5 views
28

Ho un'animazione CAKeyframeAnimation che desidero ripetere per sempre utilizzando repeatCount = HUGE_VALF. La durata dell'animazione è di 2 secondi, ma mi piacerebbe avere una pausa di 3 secondi prima di ogni ciclo.CAKeyframe Ritardo di registrazione prima della ripetizione

Gli unici 2 modi in cui posso pensare di fare che sono:

  1. rendere l'intera animazione ultimi 5 secondi e aggiungere keyTimes e valori aggiunti in modo che ho la pausa che sto cercando durante l'ultima 3s dell'animazione 5s. Questo sembra un po 'hacky.

  2. Fare in modo che l'animazione si ripeta una sola volta e quindi aggiungere l'uso di qualcosa come performSelector:afterDelay:2 per eseguire nuovamente l'animazione e così via e così via. Anche questo sembra sporco. Significa anche che devo chiamare lo addAnimation: ogni 5 secondi, che non sono sicuro sia ottimale in termini di prestazioni.

C'è un'altra opzione che potrebbe mancare? Uno di questi 2 metodi è migliore dell'altro?

risposta

110

Scaricando le animazioni di Apple MKUserLocationView, sono stato in grado di vedere come stavano facendo. Risulta che questo è ciò che è CAAnimationGroup. Incapsulando un'animazione 2 secondi in un gruppo di animazione 5 secondi, ci si ritroverà con un'animazione di 2 secondi seguito da un ritardo di 3 secondi: risposta

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 soluzione. Bello e pulito. Dovresti accettare la tua risposta. ;-) –

+1

Molto utile. Huhu. –

+0

Wooh .. Grazie per questo signore .. funziona perfettamente fino ad ora .. :) – 0yeoj

4

di samvermette a 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")