2012-10-08 2 views
4

저는 Objective C에서 간단한 회전을 시도하고 있으며 배트에서 몇 가지 문제가 있습니다. 한 가지는 내가 CGAffineTransformRotate에서 얻은 불일치와 어떻게 그 함수 안에서 M_PI가 일관성이 없는가하는 것입니다.CGAffineTransformRotate 및 M_PI 불일치 (Objective C, iOS)

이렇게하면 버튼에 연결한다고 가정합니다. 한 번 누르면 반 시계 방향으로 180도 회전하고 (문서를 따라 가며 잘 읽습니다.) 다시 누를 때 값이 음수가 아니더라도 180 이 시계 방향으로 회전합니다. -M_PI에 M_PI을 변경하면 회전 차이점없이 똑같은 일을 :

[UIView animateWithDuration:secs delay:0.0 options:option 
    animations:^{ 
     self.transform = CGAffineTransformRotate(self.transform, M_PI); //Inconsistent 
} completion:nil]; 

을 지금 내가 그것을 인쇄 할 때 M_PI에 포함 된 값이다, 3.141593로 M_PI을 변경 같아요. 자, 버튼을 누르면 완전히 잘 동작합니다. 두 번 모두 시계 반대 방향으로 180도 회전합니다. 내가 -3.141593로 변경하면 시계 방향으로, 너무 완벽하게 잘 작동합니다 : 나는 그것으로 연주 할 때 더 많은 행동이 더 이상 얻을

self.transform = CGAffineTransformRotate(self.transform, 3.141593); //Works 

.

90도 (π/2) 회전하려고한다고 가정합니다. M_PI 이제 값을 사용하여 같은 동작을 가지고 있지만 회전은 그것이 있어야 무엇을 반대 :

//Should be Clockwise but rotates CounterClockwise 
self.transform = CGAffineTransformRotate(self.transform, -M_PI/2); 
self.transform = CGAffineTransformRotate(self.transform, -1.5707965); 

//Should be CounterClockwise but rotates Clockwise 
self.transform = CGAffineTransformRotate(self.transform, M_PI/2); 
self.transform = CGAffineTransformRotate(self.transform, 1.5707965); 

그리고 나는 180 개도 (PI)을 통해 무엇을 회전 할 경우, 동작은 가장 짧은 회전하는 것입니다 비록 내가 양수 또는 음수 회전을 지정한다고해도 360도 (2PI)를 회전해도 회전하지 않습니다.

누군가 이러한 일이 발생하는 이유를 말해 줄 수 있고 더 일관성있게 만들 수 있습니까? 그리고 제가 가지고있는 2 차 질문은 270과 360도 회전시킬 수있는 방법입니다.

감사합니다.

답변

11

animateWithDuration을 사용할 때 실제로 회전 방향을 제어 할 수 없다는 것이 문제입니다. 항상 최단 경로를 택할 것입니다. 180도 회전 할 때 행동은 이론적으로 최단 경로의 가능성이 2 가지이므로 결정되지 않습니다. 이것은 또한 180도 이상 회전 할 수없는 이유를 설명합니다. 애니메이션을 더 잘 제어하고 더 복잡한 애니메이션을 만들고 싶다면 CAKeyframeAnimation을 사용하십시오.

+0

왜 pi/2 (90)를 돌려서 반대 방향으로 3pi/2 (270) 위치로 회전합니까? – FireDragonMule

0

phix23은 다음과 같이 말했습니다. 항상 최단 경로를 취합니다. 그래서 당신은 시계 방향으로 완전한 원을 가서 예를 들어,이 트릭을 사용하여이 문제를 피할 수 있습니다 : 당신이 원을 분할해야한다 예를 들어 3 개의 통제 지점에 대한 위해 :

[UIView animateWithDuration:secs delay:0.0 options:UIViewAnimationOptionCurveLinear 
animations:^{ 
    self.transform = CGAffineTransformRotate(self.transform, M_PI_2/3); 
} completion:(BOOL end) 
{ 
     [UIView [UIView animateWithDuration:secs delay:0.0 
            options:UIViewAnimationOptionCurveLinear 
    animations:^{ 
     self.transform = CGAffineTransformRotate(self.transform, -M_PI_2/3); 
    } completion:(BOOL end) 
    { 
    } 

} 

]; 

이 코드는 테스트되지 않았습니다, 문제가있는 경우, 재생하려고 있도록 그것으로. 희망이 도움이 될 것입니다.