2012-07-12 3 views
5

회전에 UIViewAnimationCurve를 사용하고 위치 변경에 대해 하나의 UIViewAnimationCurve를 사용할 수 있기를 원합니다. 이것이 가능한가?동일한 애니메이션에서 두 개의 다른 UIViewAnimationCurves 사용

예를 들어 (의사 코드로);

// Begin animations 

// Set rotation animation curve to EaseInOut 

// Set position animation curve to Linear 

// Make some changes to position 

// Make some change to the angle of rotation 

// Commit the animations 

편집 : (CAAnimationGroup 방법은 아래의 제안) - 2 개의 별도 CABasicAnimations을 만든 및 CAAnimationGroup 그러나 애니메이션이 시작되지 않습니다. 어떤 아이디어?

CABasicAnimation *postionAnimation = [CABasicAnimation animationWithKeyPath:@"position"]; 
postionAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear]; 
postionAnimation.toValue = [NSValue valueWithCGPoint:[self transformPointToWorldSpaceFromViewSpace:self.spriteView.position]]; 
postionAnimation.delegate = self; 

CABasicAnimation *rotationAnimation = [CABasicAnimation animationWithKeyPath:@"transform.z"]; 
rotationAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]; 
rotationAnimation.toValue = [NSNumber numberWithFloat:self.spriteView.angle -= M_PI_2]; 
rotationAnimation.delegate = self; 

CAAnimationGroup *animationsGroup = [CAAnimationGroup animation]; 
animationsGroup.duration = self.clockSpeed; 
animationsGroup.animations = [NSArray arrayWithObjects:postionAnimation, rotationAnimation, nil]; 

// Perform the animation 
[self.spriteView.layer addAnimation:animationsGroup forKey:nil]; 

답변

3

가장 좋은 방법은 animateWithDuration 여러 통화를 사용하는 것입니다 완료를 :. 각 호출마다 다른 애니메이션 곡선을 사용하면 병렬로 실행됩니다. 또는 다른 지연 값을 사용하여 순서대로 실행할 수 있습니다.

코드는 다음과 같습니다 당신이 CAAnimationGroups를 사용하는 경우

[UIView animateWithDuration: .5 
    delay: 0 
    options: UIViewAnimationOptionCurveEaseInOut 
    animations: ^{ 
    view1.center = CGPointMake(x, y); 
    } 
    completion: ^{ 
    //code that runs when this animation finishes 
    } 
]; 

[UIView animateWithDuration: .5 
    delay: .5 
    options: UIViewAnimationOptionCurveLinear 
    animations: ^{ 
    view2.center = CGPointMake(x2, y2); 
    } 
    completion: ^{ 
    //code that runs when this animation finishes 
    } 
]; 

는, 몇 가지 문제가 있습니다.

먼저 애니메이션 그룹이 전체 그룹의 애니메이션 커브를 결정합니다. 나는 당신이 각 서브 애니메이션마다 다른 곡선을 지정할 수 있다고 생각하지 않는다. (나는 그것을 시도하지 않았다고 고백한다.)

둘째, 그룹에 애니메이션을 추가하면, 개별 애니메이션의 델리게이트는 라는. 애니메이션 그룹의 대리자 메서드 만 호출됩니다.

+0

Duncan에게 감사드립니다. 내일 갈거야. Dave –

+0

안녕 Duncan,이 일을하고 치료를 작동! 내가 가진 유일한 질문은, 내 자체 [transformPointToViewSpaceFromWorldSpace : self.spriteView.position] 내 블록을 호출하는 것이 좋습니다? 그것은 작동하고 악기는 누출을 보이지 않지만 블록 내에서 자기를 사용하는 것에 대해 막연하게 기억합니다. 다시 한번 감사드립니다, Dave. –

4

두 개의 다른 애니메이션을 만들어보십시오. UIView의 메서드를 사용하면 애니메이션의 여러 속성에 대해 서로 다른 애니메이션 커브를 설정할 수 없습니다. 또는 CAAnimations를 재미있게 사용하고 두 개의 CABasicAnimation을 설정하는 CAAnimationGroup을 만들 수 있습니다.

+0

iSofTom에게 감사드립니다.이 방법을 시도했지만 (위의 편집 참조) 위임 방법에 따라 애니메이션이 시작되지 않습니다. 어떤 아이디어? –

0

Ok, 마지막으로 해결했습니다. 방향 iSofTom 주셔서 감사합니다 (귀하의 답변을 투표). 개별 애니메이션의 대표는 설정했지만 그룹은 설정하지 않았습니다. 지연 : 옵션 : 애니메이션 :

CABasicAnimation *postionAnimation = [CABasicAnimation animationWithKeyPath:@"position"]; 
postionAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear]; 
postionAnimation.fromValue = [NSValue valueWithCGPoint:self.spriteView.center]; 
postionAnimation.toValue = [NSValue valueWithCGPoint:[self transformPointToViewSpaceFromWorldSpace:self.spriteView.position]]; 

CABasicAnimation *rotationAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"]; 
rotationAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]; 
rotationAnimation.fromValue = [NSNumber numberWithFloat:self.spriteView.angle]; 
rotationAnimation.toValue = [NSNumber numberWithFloat:self.spriteView.rotation]; 

CAAnimationGroup *animationsGroup = [CAAnimationGroup animation]; 
animationsGroup.duration = self.clockSpeed; 
animationsGroup.animations = [NSArray arrayWithObjects:postionAnimation, rotationAnimation, nil]; 
animationsGroup.delegate = self; 
// Perform the animation 
[self.spriteView.layer addAnimation:animationsGroup forKey:nil]; 

- (void)animationDidStart:(CAAnimation *)theAnimation { 
radiansToDegrees(self.spriteView.rotation)); 
    self.spriteView.angle = self.spriteView.rotation; 

NSStringFromCGPoint(self.spriteView.position)); 
    self.spriteView.center = [self transformPointToViewSpaceFromWorldSpace:self.spriteView.position]; 
} 
관련 문제