0

한 손가락으로 축을 따라 UIView를 회전하기 위해 UIPanGestureRecognizer를 구현했습니다. uiview 내의 버튼은 UIView가 회전하는 지점에서 제스처를 시작합니다. 문제는 버튼이 첫 번째 사분면, 왼쪽 상단에있는 경우에만 올바르게 회전한다는 것입니다. 다른 모든 사분면은 이상하게 회전합니다. 누군가 내 수학에 잘못된 점을 말해 줄 수 있습니까? 그런데 ang은 수퍼 뷰의 좌표를 사용하여 각도를 계산합니다. 사용자 손가락이 회전하는 뷰 경계 바깥에있을 수 있기 때문입니다.하지만 그럴 필요는 없습니다. 손가락 1 개로 UIView 회전 iPhone, iPad

당신에게

- (void)rotateItem:(UIPanGestureRecognizer *)recognizer 
{ 
    NSLog(@"Rotate Item"); 

    float ang = atan2([recognizer locationInView:self.superview].y - self.center.y, [recognizer locationInView:self.superview].x - self.center.x); 

    float angleDiff = deltaAngle - ang; 
    self.transform = CGAffineTransformRotate(startTransform, -angleDiff); 

    CGFloat radians = atan2f(self.transform.b, self.transform.a); 
    NSLog(@"rad is %f", radians); 
} 

#pragma mark - Touch Methods 

- (BOOL)gestureRecognizerShouldBegin:(UIPanGestureRecognizer *)recognizer 
{ 

    if (recognizer == rotateGesture) { 
     NSLog(@"rotate gesture started"); 

     deltaAngle = atan2([recognizer locationInView:self].y-self.center.y, [recognizer locationInView:self].x-self.center.x); 

     startTransform = self.transform; 
    } 

    return YES; 
} 

답변

0

내가 한 몇 가지 기록을 감사하고 내 UIView의 중심이 터치 드래그 이벤트 기간 동안 변화 한 것으로 보인다. 그래서 나는 터치 방식으로 uiview의 중심을 저장하고 대신 사용했습니다.

- (void)rotateItem:(UIPanGestureRecognizer *)recognizer 
    { 
     NSLog(@"Rotate Item"); 

     CGPoint superPoint = [self convertPoint:itemCenter toView:self.superview]; 

     float ang = atan2([recognizer locationInView:self.superview].y - superPoint.y, [recognizer locationInView:self.superview].x - superPoint.x); 

     float angleDiff = deltaAngle - ang; 
     self.transform = CGAffineTransformRotate(startTransform, -angleDiff); 

    } 

    #pragma mark - Touch Methods 

    - (BOOL)gestureRecognizerShouldBegin:(UIPanGestureRecognizer *)recognizer 
    { 

     if (recognizer == rotateGesture) { 
      NSLog(@"rotate gesture started"); 

      deltaAngle = atan2([recognizer locationInView:self.superview].y-self.center.y, [recognizer locationInView:self.superview].x-self.center.x); 

      startTransform = self.transform; 
     } 

     return YES; 
    }