在touchesMoved上获取UIView的旋转方向

时间:2010-03-19 01:42:04

标签: objective-c uiview rotation trigonometry

这可能听起来很有趣,但我花了好几个小时尝试使用UIView和一些trig来重新创建一个具有逼真旋转的旋钮。我实现了目标,但现在我无法弄清楚如何知道旋钮是向左还是向右旋转。数学中最相关的部分是:

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

    float dx = pt.x  - iv.center.x;
    float dy = pt.y  - iv.center.y;
    float ang = atan2(dy,dx);

    //do the rotation
    if (deltaAngle == 0.0) {
        deltaAngle = ang;
        initialTransform = iv.transform;
    }else
    {
        float angleDif = deltaAngle - ang;
        CGAffineTransform newTrans = CGAffineTransformRotate(initialTransform, -angleDif);
        iv.transform = newTrans;
        currentValue = [self goodDegrees:radiansToDegrees(angleDif)];
    }
}

理想情况下,我可以利用数值来告诉我旋转是正还是负。

2 个答案:

答案 0 :(得分:2)

如果您的旋钮的中心点是您用于旋钮的图像的中心,那么您应该能够检测到触摸是从中心的左/右开始并向上/向下移动。如果触摸从左侧开始并向下移动则向左旋转。反之亦然,从中心的另一侧开始。您可以通过在touchesDidMove方法中将连续的x坐标放在数组中并进行简单比较来检测触摸是向上还是向下移动。

答案 1 :(得分:0)

谢谢卸妆。这接近我需要的,但最后,由于旋钮对象将事件传递给控制器​​类,我需要一种方法来测量旋转的值...即:在CClockWise中340 *是94%。无论如何,我最终使用上面的方法解决了这个问题,并将currentValue传递给了一个委托。然后委托将采用该方法并使用它自己的私有浮点数,比较该值是否高于或低于收到的最后一个值:

//委托使用私有值来衡量上次回调 #pragma mark UIKnobViewDelegate - (void)dialValue:(float)值 {     if(lastValue == 0.00){         lastValue = lastValue;     }     如果(价值 从那里开始,我们的控制器可以做任何喜欢的事情