2012-07-06 146 views
0

我实现了一个UIPanGestureRecognizer,因为我希望用一根手指沿着它的轴旋转一个UIView。 uiview中的按钮开始UIView旋转的手势。问题是只有当按钮位于第一象限左上方时才能正确旋转。任何其他象限和它不正常旋转。有人能告诉我我的数学有什么问题吗?顺便说一下,ang使用超视图的坐标来计算角度,因为用户的手指可能在旋转视图边界之外,但这可能不是必需的。用一根手指旋转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中心触拖事件过程中发生变化。因此,我用touches开始的方法存储了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; 
    }