2014-10-05 2 views
1

다음 코드를 사용하여 UIView를 90 도로 회전합니다.CGAffineTransformMakeRotation을 사용하여 UIView를 회전하십시오.

- (IBAction)rotateView:(id)sender { 

    [UIView animateWithDuration:0.2 animations:^{ 
     _myView.transform = CGAffineTransformMakeRotation(M_PI/2); 
    }]; 
} 

내가 rotateView 작업을 호출하면 다시 _myView 다시 회전하지 않습니다. 어떤 아이디어로 어떻게 해결할 수 있습니까? rotateView를 호출 할 때마다 _myView를 90도 회전시키고 싶습니다.

답변

0

myView에 변환을 추가하면 기존의 변환 된 상태가 아니라 변환을 덮어 쓰게됩니다. 즉, 두 번째로 transform = CGAffineTransformMakeRotation (M_PI/2)을 설정하면 실제로 변환이 변경되지 않습니다.

편집 : Rob는 지적했듯이 회전 값이 이미 변환에 저장되어있는 경우 rotationInRadians 속성을 사용할 필요가 없습니다. 대신 당신은 단순히이 같은 기존 변환 수정할 수 있습니다

[UIView animateWithDuration:0.2 animations:^{ 
    _myView.transform = CGAffineTransformRotate(_myView.transform, M_PI/2); 
}]; 

다음은 내가 이전에 제시 한 이상적이지 솔루션입니다.

로테이션을 추적하는 변수가 필요합니다. 회전 할 때마다 원하는만큼이 변수를 증가시킨 다음 변수의 새 값을 기반으로 새로운 변환을 작성합니다.

는 속성이이 작업을 수행 할 수 있도록 :

@property (nonatomic, assign) CGFloat rotationInRadians; 

이 init 메소드에서 0으로 초기화합니다. 그런 다음 rotateView 메서드를 수정하여 rotateInRadians을 늘리고 새 변형을 적용합니다.

- (IBAction)rotateView:(id)sender { 
    self.rotationInRadians += M_PI/2; 
    [UIView animateWithDuration:0.2 animations:^{ 
     _myView.transform = CGAffineTransformMakeRotation(self.rotationInRadians); 
    }]; 
} 
+0

놀라운! 고마워. –

+0

이미 뷰의 변형에있을 때 별도의 변수에서 회전을 추적 할 이유가 없습니다. –

+0

좋은 지적입니다. 나는 그것을 외부 변수에 저장하는 것에 이점이 없다. 저는 롭의 대답이 더 간단하고 정확하다고 말하고 싶습니다. – dfmuir

2
[UIView animateWithDuration:0.2 animations:^{ 
    _myView.transform = CGAffineTransformRotate(_myView.transform, M_PI/2); 
}]; 
관련 문제