2013-10-23 2 views
2

안녕하세요 간단한 핵심 애니메이션이 반복을 : 내가 애니메이션 전에 지연을 설정할 수 있습니다지연 다음 CAAnimation

NSString *keyPath2 = @"anchorPoint.y"; 
CAKeyframeAnimation *kfa2 = [CAKeyframeAnimation animationWithKeyPath:keyPath2]; 
[kfa2 setValues:[NSArray arrayWithObjects: 
       [NSNumber numberWithFloat:-.05], 
       [NSNumber numberWithFloat:.1], 
       [NSNumber numberWithFloat:-.1], 
       [NSNumber numberWithFloat:.1], 
       [NSNumber numberWithFloat:-.05], 
       nil]]; 
//[kfa2 setRepeatCount:10]; 
[kfa2 setRepeatDuration:30]; 
[kfa2 setDuration:.35]; 
[kfa2 setAdditive:YES]; 
[kfa2 setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]]; 

을 반복 얻을 어떻게?

그리고 누군가가 repeatCount와 repeatDuration의 차이점을 설명 할 수 있다면.

@selector를 사용하고 싶지 않습니다.

고맙습니다. CAMediaTiming protocol's documentation, repeatCountrepeatDuration에 따르면

답변

1

repeatDurationrepeatCount = repeatDuration/durationrepeatCount을 설정하는 또 다른 방법입니다 repeatCount 무슨 뜻인지 의미를 동시에 설정할 수 없습니다.

마지막 값을 추가하여 CAKeyframeAnimation으로 지연을 시뮬레이트 할 수 있습니다. 예를 들어 다음과 같은 애니메이션이 있습니다.

kfa.values = @[@1, @3, @7]; // Using object literal syntax (Google it!), the way to go 
kfa.keyTimes = @[@.0, @.5, @1]; // 0.5 = 5/10; 1 = 10/10; 
kfa.duration = 10; // 10 sec, for demonstration purpose 

이제 반복하기 전에 1 초 지연시켜야합니다. 간단히 내용을 다음으로 변경하십시오.

kfa.values = @[@1, @3, @7, @7]; // An additional value 
kfa.keyTimes = @[@.0, @.4546, @.9091, @1]; // 0.4546 = 5/11; 0.9091 = 10/11; 1 = 11/11 
kfa.duration = 11; 

계산이 약간 복잡하지만 간단합니다.

+0

감사합니다. 완벽 해! –

-1

CAAnimationGroup을 사용할 수도 있습니다.

let scale   = CABasicAnimation(keyPath: "transform.scale") // or CAKeyFrameAnimation 
scale.toValue = 2.0 
scale.fillMode = kCAFillModeForwards 
scale.duration = 0.4 
scale.beginTime = 1.0 // Repeat delay. 
let scaleGroup = CAAnimationGroup() 
scaleGroup.duration = scale.duration + scale.beginTime 
scaleGroup.fillMode = kCAFillModeForwards 
scaleGroup.repeatCount = Float.infinity 
scaleGroup.animations = [scale] 
scaleGroup.beginTime = CACurrentMediaTime() + 0.8 // Initial delay. 

let view = UIView(frame: CGRect(x: 0, y: 0, width: 200, height: 200)) 
view.backgroundColor = UIColor.orange 

let viewb = UIView(frame: CGRect(x: 50, y: 50, width: 100, height: 100)) 
viewb.backgroundColor = UIColor.blue 
view.addSubview(viewb) 

viewb.layer.add(scaleGroup, forKey: "") 

// If you want to try this on Playground 
PlaygroundPage.current.liveView = view 
+0

scale.beginTime은 첫 번째 루프 이전의 지연을 나타내지 만 각 애니메이션 루프 이전의 지연은 나타냅니다. – eXhausted

+0

@eXhausted 샘플 코드를 한 번 더 사용해 볼 수 있습니까? 샘플 코드를 수정하여 Xcode8.2.1 Playground에서 시도해 보았습니다. 각 애니메이션 루프에 scale.beginTime이 적용되었는지 확인할 수있었습니다. – Tueno