2013-03-03 2 views
28

CAKeyframeAnimation 애니메이션을 사용하고 있습니다. 영속적으로는 repeatCount = HUGE_VALF을 사용하고 싶습니다. 애니메이션의 지속 시간은 2 초이지만 각주기 전에 3 초의 일시 중지를하고 싶습니다. 이다 내가하고 생각할 수CAKeyframeAnimation 반복 전의 지연

은 2 가지 방법 :

  1. 전체 애니메이션을 마지막으로 5 초 확인하고 추가 keyTimes 및 값을 추가 그래서 내가 마지막시를 찾고 있어요 일시 정지를 얻을 5s 애니메이션의 3s. 좀 해킹 된 것 같아.

  2. 애니메이션을 한 번만 반복 한 다음 performSelector:afterDelay:2과 같은 것을 사용하여 애니메이션을 다시 실행하는 식으로 계속합니다. 이것은 더러웠다. 또한 나는 매 5 초마다 addAnimation:으로 전화해야한다는 것을 의미 할 것이다. 나는 성능면에서 최적인지 확신 할 수 없다.

다른 옵션이 있습니까? 그 두 가지 방법 중 하나가 다른 것보다 낫습니까?

답변

110

Apple의 MKUserLocationView 애니메이션을 덤핑하면 어떻게하는지 알 수있었습니다. 이것이 CAAnimationGroup을위한 것이라고 밝혀졌습니다. 스위프트 3

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

영리한 5 초 애니메이션 그룹으로 2 초 애니메이션을 캡슐화하여 3 초 지연으로 다음 2 초 애니메이션 될 겁니다 해결책. 좋고 깨끗합니다. 당신은 당신 자신의 대답을 받아 들여야합니다. ;-) –

+1

매우 도움이됩니다. 후후. –

+0

우 ..이 선생님 께 감사드립니다. 지금까지 완벽하게 작동하고 있습니다. :) – 0yeoj

4

samvermette의 대답 :

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") 
관련 문제