2012-05-24 3 views
3

동시에 레이어의 변형의 배율 및 변환을 적용하고 싶지만 번역 애니메이션 만 실행합니다.스케일 및 변환을 위해 CAKeyframeAnimations를 결합 할 수 없습니다.

:

여기
self.mainImage.layer.anchorPoint = CGPointMake(0.5, 1); 
    CAKeyframeAnimation *mainAnimationScale = [CAKeyframeAnimation animationWithKeyPath:@"transform.scale.y"]; 
    mainAnimationScale.duration    = 0.75; 
    mainAnimationScale.repeatCount   = 0; 
    mainAnimationScale.removedOnCompletion = YES; 
    mainAnimationScale.autoreverses   = NO; 
    mainAnimationScale.fillMode    = kCAFillModeForwards; 
    mainAnimationScale.values    = [NSArray arrayWithObjects: 
              [NSNumber numberWithFloat:1.0], 
              [NSNumber numberWithFloat:1.0], 
              [NSNumber numberWithFloat:0.7], 
              [NSNumber numberWithFloat:1.0], 
              [NSNumber numberWithFloat:0.85], 
              [NSNumber numberWithFloat:1.0], 
              nil]; 
    mainAnimationScale.keyTimes    = [NSArray arrayWithObjects: 
              [NSNumber numberWithFloat:0], 
              [NSNumber numberWithFloat:0.65], 
              [NSNumber numberWithFloat:0.72], 
              [NSNumber numberWithFloat:0.84], 
              [NSNumber numberWithFloat:0.91], 
              [NSNumber numberWithFloat:1], 
              nil]; 

나는 translation.y하는 키 패스로 번역 애니메이션을 만들 : 여기에 잘못된 코드 ... 여기

내가 scale.y하는 키 패스와 스케일 애니메이션을 만들입니다 여기
CAKeyframeAnimation *mainAnimationTrans = [CAKeyframeAnimation animationWithKeyPath:@"transform.translation.y"]; 
    mainAnimationTrans.duration    = 0.75; 
    mainAnimationTrans.repeatCount   = 0; 
    mainAnimationTrans.removedOnCompletion = YES; 
    mainAnimationTrans.autoreverses   = NO; 
    mainAnimationTrans.fillMode    = kCAFillModeForwards; 
    mainAnimationTrans.values    = [NSArray arrayWithObjects: 
             [NSNumber numberWithFloat:-250.0], 
             [NSNumber numberWithFloat:-250.0], 
             [NSNumber numberWithFloat:0], 
              nil]; 
    mainAnimationTrans.keyTimes    = [NSArray arrayWithObjects: 
              [NSNumber numberWithFloat:0], 
              [NSNumber numberWithFloat:0.65], 
              [NSNumber numberWithFloat:1], 
              nil]; 

I 그룹 함께하고있는 UIView의 레이어에 적용 :

CAAnimationGroup *theGroup = [CAAnimationGroup animation]; 
    theGroup.duration = 0.75; 
    theGroup.repeatCount = 0; 
    theGroup.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn]; 
    theGroup.animations = [NSArray arrayWithObjects:mainAnimationTrans, mainAnimationScale, nil]; 
    [self.mainImage.layer addAnimation:theGroup forKey:@"layerAnimation"]; 

I 처음에이 같은 층에 직접 애니메이션을 추가했는데, 그 중 하나가 작동하지 않았다 : 나는 모든 문자열을 시도했습니다

[self.mainImage.layer addAnimation:mainAnimationTrans forKey:@"transform.scale.y"]; 
    [self.mainImage.layer addAnimation:mainAnimationTrans forKey:@"transform.translation.y"]; 

내가 키 패스의 값에 대해 생각할 수있는 그리고 그것이 뭔가를 가지고 같은데요 변환의 두 가지 측면을 애니메이션으로 처리한다는 사실을 염두에 두십시오.하지만이 그룹을 사용하면 문제가 해결 될 것이라고 생각했습니다. 아아 ...

답변

2

변환 작업의 핵심은 변환을 결합하는 것입니다. 나는 왜 그것이 기본 매트릭스 수학이기 때문에 이것을 더 빨리 깨닫지 못했는지 나는 모른다. 나는 동료가 어제 그것을 언급했다고 생각한다. 알았어.

어쨌든 내가하려는 애니메이션은 항목이 드롭 다운되고 대상에 도달하면 튀어 오르게하는 것입니다.

self.mainImage.layer.anchorPoint = CGPointMake(0.3, 1.0); 
    CAKeyframeAnimation *mainImageAnimation = [CAKeyframeAnimation animationWithKeyPath:@"transform"]; 
    mainImageAnimation.duration    = 0.75; 
    mainImageAnimation.repeatCount   = 0; 
    mainImageAnimation.removedOnCompletion = NO; 
    mainImageAnimation.autoreverses   = NO; 
    mainImageAnimation.fillMode    = kCAFillModeForwards; 
    mainImageAnimation.values    = [NSArray arrayWithObjects: 
             [NSValue valueWithCATransform3D:CATransform3DScale(CATransform3DMakeTranslation(-8, -250, 0), 1, 1, 1)], 
             [NSValue valueWithCATransform3D:CATransform3DScale(CATransform3DMakeTranslation(-8, 17, 0), 1, 1, 1)], 
             [NSValue valueWithCATransform3D:CATransform3DScale(CATransform3DMakeTranslation(-8, 17, 0), 1.2, .8, 1)], 
             [NSValue valueWithCATransform3D:CATransform3DScale(CATransform3DMakeTranslation(-8, 17, 0), .85, 1.15, 1)], 
             [NSValue valueWithCATransform3D:CATransform3DScale(CATransform3DMakeTranslation(-8, 17, 0), 1.1, .9, 1)], 
             [NSValue valueWithCATransform3D:CATransform3DScale(CATransform3DMakeTranslation(-8, 17, 0), 1, 1, 1)], 
              nil]; 
    mainImageAnimation.keyTimes    = [NSArray arrayWithObjects: 
              [NSNumber numberWithFloat:0], 
              [NSNumber numberWithFloat:0.6], 
              [NSNumber numberWithFloat:0.65], 
              [NSNumber numberWithFloat:0.78], 
              [NSNumber numberWithFloat:0.88], 
              [NSNumber numberWithFloat:1], 
              nil]; 
    mainImageAnimation.timingFunctions  = [NSArray arrayWithObjects: 
             [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear], 
             [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear], 
             [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear], 
             [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear], 
             [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear], 
             [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear], 
              nil]; 
    [self.mainImage.layer addAnimation:mainImageAnimation forKey:@"transform"]; 

것들 주목할 :

  • 것은 CATransform3DXXX의 변환 인수에 CATransform3DMakeXXX 함수의 결과를 피드백함으로써 특성 개별 변환을 결합 여러 변형 효과 여기서 코드는 기능.
  • 매트릭스 연산을 사용하면 변환 순서가 중요합니다. 매트릭스에 마지막으로 입력 한 것은에 적용됩니다. 제 경우에는 스케일을 적용하기 전에 변환을 적용하기를 원하기 때문에 먼저 스케일 변환을 만들어 후속 변환 변환에 적용해야합니다.
  • 레이어의 앵커 포인트을 변경하면 레이어의 위치가 변경됩니다. 필자의 경우에는 비대칭 인 ancor point가 필요했고 변환 변환에서의 위치 변화에 대한 설명을 볼 수 있습니다. 휴식 장소는 0,0이지만 -8,17이 아닙니다.

희망이 있습니다.

0

질문과는 다르지만 관련된 두 개의 CAKeyFrameAnimations (회전 및 크기 조정)를 결합하려고했습니다. 만 회전이 일어나고 이후, 작동하지 않았다 개별적으로 애니메이션을 추가

CAKeyframeAnimation *wiggle = [CAKeyframeAnimation animationWithKeyPath:@"transform.rotation"]; 
wiggle.values = @[ @0.0, @-0.15, @0.0, @0.15, @-0.15, @0.0]; 
wiggle.keyTimes = @[ @0.0, @0.2, @0.4, @0.6, @0.8, @1.0]; 
wiggle.duration = 0.5; 

CAKeyframeAnimation *resize = [CAKeyframeAnimation animationWithKeyPath:@"transform.scale"]; 
resize.duration = 0.5; 
resize.values = @[@1.0, @1.5, @1.0]; 
resize.keyTimes = @[@0.0, @0.5, @1.0]; 

.나는 두 CAKeyFrameAnimations를 포함 애니메이션 그룹을 만들 때

[self.layer addAnimation:wiggle forKey:kAnimationKey]; 
[self.layer addAnimation:resize forKey:kAnimationKey]; 

그러나 그것은했다.

CAAnimationGroup *animGroup = [[CAAnimationGroup alloc] init]; 
animGroup.animations = @[wiggle, resize]; 
animGroup.duration = 0.5; 

[self.layer addAnimation:animGroup forKey:kAnimationKey];