在车速表的箭头旋转

时间:2012-02-09 13:16:10

标签: iphone ios

我已经实施了一个速度计。我有一个箭头图像。我想通过手指触摸非常平滑地旋转0°到180°,我也应该给出界限。怎么可能?

这是我的代码(在UIImageView类别中):

- (void) touchesMoved:(NSSet*)touches withEvent:(UIEvent*)event
{
    UITouch *touch = [touches anyObject];

    CGPoint currentLocation = [touch locationInView:self.superview];
    CGPoint pastLocation = [touch previousLocationInView:self.superview];

    CGPoint d1 = CGPointMake(currentLocation.x-self.superview.center.x, currentLocation.y-self.superview.center.y);   
    CGPoint d2 = CGPointMake(pastLocation.x-self.superview.center.x, pastLocation.y-self.superview.center.y);

    CGFloat angle1 = atan2(d1.y, d1.x); 
    CGFloat angle2 = atan2(d2.y, d2.x); 

    self.transform = CGAffineTransformRotate(self.transform, angle1-angle2);
}

旋转0到360度,我需要在20到160度的角度之间进行限制。

1 个答案:

答案 0 :(得分:3)

找出基于触摸(使用trig)应用的正确仿射变换并应用它。

 view.transform = CGAffineTransformMakeRotation(angleInRadians);

可能你需要首先翻译原点,然后再翻译,让它围绕你想要的点旋转。或者,您可以创建视图,以便枢轴点位于视图的中心。

要计算角度,请找到触点距旋转点的距离(dx,dy)。

  

tan角= dy / dx

使用

 atan2(dy, dx)

因为它通过知道它所在的象限来处理这些符号(对于dx不传递0)。

https://developer.apple.com/library/IOs/#documentation/System/Conceptual/ManPages_iPhoneOS/man3/atan2.3.html

分别处理dx为0的情况(它是PI / 2弧度)。您可能需要处理其他特殊情况来约束它 - 只需选择最小和最大弧度并在变换中使用之前检查它们。

基于问题更新的编辑:您已经完成了困难的部分 - 只需查看角度并限制它

使用MIN和MAX来限制angle1和angle2(记住它的弧度,所以20/180*pi160/180*pi)。在传递给CGAffineTransformRotate

之前执行此操作