2010-12-07 10 views
5

UIView를 동시에 움직이고 회전시키는 애니메이션을 만들고 싶습니다.움직이는 애니메이션 UIView가 작동하지 않습니다.

[UIView beginAnimations:@"MoveAndRotateAnimation" context:nil]; 
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut]; 
[UIView setAnimationDuration:kAnimationDuration]; 

myView.frame = newFrame; 
myView.transform = CGAffineTransformMakeRotation(0.4); 

[UIView commitAnimations]; 

결과는, 애니메이션이 완료되면보기가 잘못 그려지는 것을 (일부 지역은 더 이상 볼 수 없습니다) : 나는 다음 코드를 시도했다. 프레임 또는 애니메이션의 변형 만 변경하면 뷰가 올바르게 그려집니다. 이 문제는 프레임과 변환을 모두 설정 한 경우에만 발생합니다.

보기의 이동 및 회전을 동시에 움직이게하는 올바른 방법은 무엇입니까?

+0

'newFrame'은 어디에 정의되어 있습니까? –

+0

"beginAnimations"줄 바로 앞에 정의되어 있습니다. CGRect newFrame = CGRectMake (3030200200); – kiteloop

답변

8

회전 등의 애니메이션 작업을하는 경우 프레임, 경계 또는 가운데를 사용할 수 없습니다. CGAffineTransforms를 모든 것에 사용하고 함께 연결해야합니다. 좋아요 :

CGAffineTransform transform = CGAffineTransformMakeTranslation(100,100); 
transform = CGAffineTransformRotate(transform, 0.4); 

[UIView beginAnimations:@"MoveAndRotateAnimation" context:nil]; 
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut]; 
[UIView setAnimationDuration:kAnimationDuration]; 

myView.transform = transform; 

[UIView commitAnimations]; 
4

은 이런 식으로 일을 시도해보십시오

[UIView beginAnimations:@"MoveAndRotateAnimation" context:NULL]; 
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut]; 
[UIView setAnimationDuration:kAnimationDuration]; 

CGPoint center   = CGPointMake(-200, self.view.center.y); 
self.view.transform = CGAffineTransformMakeRotation(-0.5); 
self.view.center  = center; 

[UIView commitAnimations]; 

중심점 위치는 물론, 뷰 이동을하고자하는 포인트가 될 것입니다 (왼쪽 이동 및 단지 예를 들어, 회전).

0

문제는 원래 프레임 크기와 비교하여 새 프레임 크기가 문제 일 수 있습니다. 프레임을 회전 할 때 프레임보기는 조금 까다 롭습니다. 프레임이 수퍼 뷰 좌표 시스템에 있습니다. 따라서 직사각형을 회전하면 새 프레임은 뷰를 포함하는 수퍼 뷰의 좌표계에서 가장 작은 직사각형이됩니다. 예 : 프레임 크기가 (100 * 100) 인 사각형보기가 있고 45도 회전하면 새 프레임의 크기는 (141 * 141)이되고 프레임을 (100 * 100) 크기로 설정하면 당신은 당신의 시야의 일부를 잘라 버릴 것입니다. 보기 프레임 작동 방식을 더 잘 이해하려면 here을보십시오.

0
이 방법을 수행 할 필요

...

#pragma mark (Woblling animation) 
    CGAffineTransform leftWobble = CGAffineTransformRotate(CGAffineTransformIdentity, RADIANS(-10.0)); 
    CGAffineTransform rightWobble = CGAffineTransformRotate(CGAffineTransformIdentity, RADIANS(10.0)); 

    self.view .transform = leftWobble; // starting point 
    [UIView beginAnimations:@"wobble" context:self.view ]; 
    [UIView setAnimationRepeatAutoreverses:YES]; // important 
    [UIView setAnimationRepeatCount:11]; 
    [UIView setAnimationDuration:1.00]; 
    //[UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:self.view cache:YES]; 
    [UIView setAnimationDelegate:self]; 
    [UIView setAnimationDidStopSelector:@selector(wobbleEnded:finished:context:)];//should be same as written 
    self.view .transform = rightWobble; // end here & auto-reverse 
    [UIView commitAnimations]; 

다음은 회전 후 같은 위치에보기를 유지하는 데 필요한 ... 이러한 방법을 구현한다.

- (void)viewWillAppear:(BOOL)animated 
{ 
    UIView* item = self.view; 
    item.transform = CGAffineTransformIdentity; 
} 

희망이 것 :

- (void) wobbleEnded:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context 
{ 
    if ([finished boolValue]) { 
     UIView* item = (UIView *)context; 
     item.transform = CGAffineTransformIdentity; 
    } 
} 

이 방법을 사용하면이 방법을두고 당신은 탐색을 사용하고 다른 하나 개의보기에서 탐색 할 때, 다음 뷰는 같은 ​​place.else에있을 것입니다 경우 도와주세요. 나는 같은 문제가 있었지만 몇 가지 실험을하고이 해결책을 찾았다. 그것이 도움이된다면 나를 투표하는 것을 잊지 마십시오.

관련 문제