使用touchesbegan和touchesmoved来区分轻弹和拖动

时间:2013-01-08 22:22:43

标签: iphone ios

我使用这两个功能来检测用户在uiview上慢慢拖放

- (void)touchesBegan:(NSSet *)触及withEvent:(UIEvent *)事件

- (void)touchesMoved:(NSSet *)触及withEvent:(UIEvent *)事件

然而,我如何使用这两种方法来检测用户实际轻弹(快速翻转)uiview?

如何区分电影与拖动?

非常感谢你的帮助!

justicepenny

3 个答案:

答案 0 :(得分:4)

你可以试试这样的 使用-(void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event方法标记beginPoint和beginTime;用于标记endPoint和endTime的ues -(void) touchesEnded:(NSSet*)touches withEvent:(UIEvent*)event方法。然后计算速度,你可以比较速度和你的阈值。(速度可能只计算水平或垂直)

答案 1 :(得分:1)

我认为你应该检查手势识别器 - 他们需要做很多工作来区分不同的用户触摸。您所描述的是平移和滑动手势。有特定的手势识别器类来处理每个类。 UIGestureRecognizer是父类,你应该先看一下。

答案 2 :(得分:1)

拖动和轻弹通常以速度来区分 - 一种解决方案是根据距离公式创建算法。

一个粗略的例子:

CGPoint pointOld = CGPointMake(0, 0); // Not sure if this is valid
CGPoint pointNew = CGPointMate(0, 0); // Just making holders for the
                                      // location of the current and previous touches

float timeInterval = 0.2f;
// However long you think it will take to have enough of a difference in
// distance to distinguish a flick from a drag

float minFlickDist = 100.0f;
// Minimum distance traveled in timeInterval to be considered a flick

- (void)callMeEveryTimeInterval
{
    // Distance formula
    float distBtwnPoints = sqrt( (pointNew.x - pointOld.x) * (pointNew.x - pointOld.x) - (pointNew.y - pointOld.y) * (pointNew.y - pointOld.y) );
    if (distBtwnPoints >= minFlickDist)
    {
        // Flick
    } else {
        // Drag
    }
}

我认为可能有用的东西的粗略草图 - 希望有所帮助。