2010-05-25 5 views
4

좋아, 기본적으로 노브로 작동하지만 화면의 절반 만 만들고있어 - 그래서 회전시키기 위해 수평 스 와이프가 필요합니다. 거의 모든 것이 하나의 예외만으로 정렬되었습니다. 중간 스 와이프에서 스 와이프의 방향을 바꾸면 방향이 바뀌지 않습니다. 나는 문제를 볼 수도 있지만 해결책에 대해 무엇을해야할지 확신하지 못합니다. 내있는 touchesMoved 그래서 스 와이프 질문으로 회전 원

, 나는 예측 가능한 방법으로 라디안으로 슬쩍 얻을 :

CGFloat 라디안 = atan2f (location.y - centerY, location.x - centerX);

라디안을 저장하고 이전 회전에 더하거나 뺀 다음 CATransform3D에 결과를 제공합니다.

따라서 스 와이프가 방향을 변경하더라도 방향의 즉각적인 변경을 허용하지 않는 "균형"이 있습니다.

이 말이 맞는가요?

답변

0

나는 모션을 긁는 턴테이블을 시뮬레이트하기 위해 이와 비슷한 작업을 수행했습니다. 시도해보십시오 :

  [CATransaction begin]; 
      [CATransaction setValue:[NSNumber numberWithInt:0] forKey:kCATransactionAnimationDuration]; 
      [myLayer setValue:[NSNumber numberWithFloat:radians] forKeyPath:@"transform.rotation.z"];   
      [CATransaction commit]; 

보기의 기본 계층에 있습니다.

1

먼저 atan()이 -π/2 .. + π/2 범위의 값을 반환하므로 원의 나머지 반에서 값을 얻지 못할 것입니다. (그 답이 그쪽에 있다고 추론하면 자신의 뒤집기/대칭을 수행해야합니다.)

감동적으로 움직이는 NSLog()에서 새로운 차이점을 계산했는지 확인하십시오. 그것은 당신이 기대하는 가치입니다.

물론 이전의 라디안을 touchesBegan에 유지하고 init에 현재 라디안을 저장하지 않고 Ennded를 터치하고 Cancelled를 터치합니다. 맞습니까?

(대부분의 경우, touchesCancelled 그냥 touchesEnded에 인수를 FWD 수 있습니다.)

당신은 모든 걸 할 경우에, 당신이 설명하는 방식은 일을해야한다. 만약 그렇지 않다면, NSLog()와 같은 더 많은 정보를 제공 할 것입니다.

1

이와 같은 상호 작용의 경우 일반적으로 가장 잘 작동하는 것은 상호 작용 시작 위치와 터치 다운 위치에 상태를 저장하는 것입니다. 그런 다음 업데이트 할 때마다 원래 터치와 현재 터치 사이의 거리를 기반으로 새 상태를 계산합니다 (원래 상태와의 차이로 적용됨).

예를 들어, 내가 언급 한 경우 터치의 현재 각도와 터치 위치를 저장하는 것이 좋습니다. 그런 다음 터치 이동에서 현재 터치 위치와 시작 위치 간의 차이를 계산합니다. 이것은 델타 값을 줄 것입니다. 델타 값은 시작 각도에 추가 할 수있는 각도로 변환 할 수 있습니다. 그에 따라 노브 그래픽을 업데이트하십시오. 이것은 당신이 당신의 각도에 대한 점진적 변화에 대한 걱정없이 당신의 행동 전반에 걸쳐 좋아하지만 방향을 바꿀 수있게해야합니다. 이것은 또한 특정 각도 후에 저항이나 댐핑 같은 것을 다루기가 매우 쉽습니다. 점진적으로 업데이트 할 때 그것을 처리하는 것보다 훨씬 쉽습니다.

+0

어떻게 차이를 각도로 변환 하시겠습니까? – Andrew

1

쿼드런트 문제 및 0으로 나누기를 피하려면 atan2을 사용하십시오. 그것이 바로 그 때문입니다.

// angle with +ve x-axis, in the range [0, 2π) 
float getDirection(CGPoint V) 
{ 
    double theta = atan2(V.x, V.y); // angle with +ve x-axis, in the range (−π, π] 
    if (theta < 0) 
     theta = 2 * M_PI - theta; 
    return theta; 
} 

+ (CGPoint) vectorFrom: (CGPoint) A to: (CGPoint) B 
{ return CGPointMake(B.x - A.x, B.y - A.y); } 
+0

+1 멋진 팁 - 나는 atan2()에 대해 잊어 버렸습니다 :) – Olie

관련 문제