2010-01-22 3 views
8

OS 3.1.2가 적용된 iPhone의 UILabel에서 수행하려고하는 두 개의 애니메이션이 있습니다. 첫 번째는 앞뒤로 UILabel의 바위 : 직접 UILabel의의 계층이 애니메이션의두 개의 코어 애니메이션을 CAAnimationGroup로 그룹화하면 하나의 CABasicAnimation이 실행되지 않습니다.

NSValue *value = nil; 
CABasicAnimation *animation = nil; 
CATransform3D transform; 
animation = [CABasicAnimation animationWithKeyPath:@"transform"]; 
transform = CATransform3DMakeScale(3.5f, 3.5f, 1.0f); 
value = [NSValue valueWithCATransform3D:transform]; 
[animation setToValue:value]; 
transform = CATransform3DMakeScale(1.0f, 1.0f, 1.0f); 
value = [NSValue valueWithCATransform3D:transform]; 
[animation setFromValue:value]; 
[animation setAutoreverses:YES]; 
[animation setDuration:30.0f]; 
[animation setRepeatCount:10000]; 
[animation setBeginTime:0.0f]; 

추가 중 하나의 기대 작품으로 : 그것은 더 큰이가되도록

CAKeyframeAnimation *rock; 
rock = [CAKeyframeAnimation animationWithKeyPath:@"transform.rotation.z"]; 
[rock setBeginTime:0.0f]; 
[rock setDuration:5.0]; 
[rock setRepeatCount:10000]; 

NSMutableArray *values = [NSMutableArray array]; 
MovingMath *math = [[MovingMath alloc] init]; 

// Center start position 
[values addObject:[math DegreesToNumber:0]]; 

// Turn right 
[values addObject:[math DegreesToNumber:-10]]; 

// Turn left 
[values addObject:[math DegreesToNumber:10]]; 

// Re-center 
[values addObject:[math DegreesToNumber:0]]; 

// Set the values for the animation 
[rock setValues:values]; 

[math release]; 

두 번째는 UILabel의를 확대합니다.

CAAnimationGroup *theGroup = [CAAnimationGroup animation]; 

theGroup.duration = 5.0; 
theGroup.repeatCount = 10000; 
theGroup.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear]; 
theGroup.animations = [NSArray arrayWithObjects:[self rockAnimation], [self zoomAnimation], nil]; // you can add more 

// Add the animation group to the layer 
[[self layer] addAnimation:theGroup forKey:@"zoomAndRotate"]; 

그룹에 애니메이션을 추가하는 순서는 중요하지 않습니다 : 나는 애니메이션을 함께 그룹화하려고하면

그러나, 첫 번째 애니메이션이 작동하지 않습니다 "흔들". 위의 방식으로 확대/축소 대신 테두리를 변경해 보았지만 실패했습니다. 어떤 통찰력이라도 대단히 감사하겠습니다. 고맙습니다.

+0

아래 내 의견을 참고하십시오 ... 나는이 애니메이션이 동시에 발생하도록하고 싶습니다. 문제는 그룹을 사용할 때 rockAnimation이 실행되지 않는다는 것입니다. zoomAnimation 만 실행됩니다. – Christian

답변

8

두 개의 변경 내용을 동시에 하나의 속성 인 CALayer의 변환에 적용하려고합니다. 첫 번째 애니메이션에서는 helper keypath를 사용하여 변형을 변경하여 회전을 만들고 두 번째 애니메이션에서는 변형을 직접 변경하여 크기 조정을 생성합니다. 두 번째 애니메이션은 첫 번째를 덮어 쓰고 있습니다. 왜냐하면 여러분은 전체 변형을 구성하고 그 사이의 크기를 조정하고 애니메이션을 적용하기 때문입니다.

두 애니메이션의 도우미 keypaths를 사용하여 레이어의 크기 조정과 회전이 모두 발생할 수 있습니다. 스케일링 애니메이션에서 코드를 변경하여

CABasicAnimation *animation = nil; 
animation = [CABasicAnimation animationWithKeyPath:@"transform.scale"]; 
[animation setToValue:[NSNumber numberWithDouble:3.5]]; 
[animation setFromValue:[NSNumber numberWithDouble:1.0]]; 
[animation setAutoreverses:YES]; 
[animation setDuration:30.0f]; 
[animation setRepeatCount:10000]; 
[animation setBeginTime:0.0f]; 

으로 변경하면 레이어에서 흔들림과 스케일링을 모두 가질 수 있습니다.

+0

감사합니다. – Christian

+0

정확히 똑같은 문제가 있지만 iPad 3.2에서는 나에게 맞지 않습니다. 회전 및 크기 조정 속성에 액세스하려고 시도하지만 그룹화 된 애니메이션은 몇 밀리 초 후에 즉시 중단되고 레이어가 다시 스냅됩니다! – brutella

2

저는 CAAnimationGroup이 당신이 원하는 것이 아니라고 생각합니다. CAAnimationGroup에 대한 문서에서 :

CAAnimationGroup 그룹화와 동시에 를 실행할 수 애니메이션 복수를 할 수 있습니다. 그룹화 된 애니메이션 은 CAAnimationGroup 인스턴스에 지정된 시간 간격으로 실행됩니다.

애니메이션이 동시에 실행되는 것을 원하지 않는 것처럼 들립니다. 이것을하는 더 쉬운 방법이 있을지도 모르지만, 나는 animationDidStop:finished: 방법에 의존하는 것이 잘 작동하는 것을 발견했습니다. 이렇게하려면 첫 번째 애니메이션을 만들고 animationDidStop:finished: 메서드를 구현할 객체에 위임자를 설정하고 CAAnimationGroup을 사용하지 않고 보통대로 애니메이션을 추가합니다. 메서드에서 :

+0

나는 이것들이 동시에 일어나길 원한다. 문제는 그룹을 사용할 때 rockAnimation이 실행되지 않는다는 것입니다. 오직 zoomAnimation 만 실행됩니다. – Christian

+0

그룹화 된 애니메이션의 지속 시간은 해당 CAAnimationGroup의 지속 시간으로 조정되지 않습니다. 대신, 애니메이션은 애니메이션 그룹의 지속 시간으로 잘립니다. 모든 애니메이션을 5 초 안에 실행하고 repeatCounts를 제거하여 문제인지 확인해보십시오. –

+0

불행히도 그 중 하나가 작동하지 않았다. – Christian

관련 문제