使用动态识别器,动态地粘贴在许多人之间

时间:2013-07-31 19:54:24

标签: ios uigesturerecognizer uipangesturerecognizer

我有一个视图,附有四个平移手势。第一个触摸的最大和最小数量设置为1,秒数设置为2,等等。这使得每个触摸器只能识别一次触摸,而屏幕上最多可以四个手指滑动。

那是花花公子。什么是无效的是检测个别触摸何时结束。当手势结束时,我发生的任何事情都会在所有手势完全结束时发生。

示例委托方法:

- (void) handlePan:(UIPanGestureRecognizer*)recognizer {

    //Setting what happens when a gesture is recognized as beginning
    if (recognizer.state == UIGestureRecognizerStateBegan) {

    //...whatever happens, bunnies follow your finger or whatever

    } else

    //Setting what happens when a gesture ends
    if ((recognizer.state == UIGestureRecognizerStateEnded) | 
        (recognizer.state == UIGestureRecognizerStateCancelled) |
        (recognizer.state == UIGestureRecognizerStateFailed)) {

        NSLog(@"end");

    }
}

应该发生的是,只要有任何手指抬起,我就会在控制台中看到“结束”。相反,直到所有的手指都被抬起,我才看到任何东西,此时我看到“结束”重复了四次(或者是屏幕上手指的次数)。

有什么方法可以按照我的意图来完成这项工作吗?

编辑在摆弄之后,我发现我可能没有正确分析我的问题。我想要在手势触摸结束时检测的全部原因是我希望手势能够在屏幕上有多个触摸时变为活动状态,但我希望每个手势仅跟踪一个触摸本身。我在跟踪触摸的手势上设置了“活动”标志,然后在触摸结束后切换该标志,但这不起作用,因为触摸端检测很难很好地实现。

但是,如果有不同的方式来实现同样的事情,那就是我正在寻找的真实事物:在许多重叠的触摸中,让每个手势识别器跟踪一个且只有一个。

2 个答案:

答案 0 :(得分:0)

你可能想做类似的事情 - 它会抓住屏幕上手指的变化以获得给定的手势;您可能需要添加更多逻辑来围绕您正在使用的手势:

switch( recognizer.numberOfTouches ) {
     case 1: {
         NSLog(@"1 ");
         break;
     }
     case 2: {
         NSLog(@"2");
         break;
     }
     case 3: {
          NSLog(@"3");
          break;
     }
     case 4: {
          NSLog(@"4");
          break;
     }
     default: {
          NSLog(@"0");
     }
}

答案 1 :(得分:0)

这是最终奏效的。

简而言之,每当手势识别器被分配触摸时,我都会制作一个标记,确保没有其他识别器接受该触摸。我还测试了每个识别器,以确保它只是在接触时才接受触摸。所以我让每次触摸只被分配一次,每个识别器只接受一次触摸。工作就像一个魅力。

 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
            //set this to no every time a new touch happens, meaning it isn't taken yet.
            touchTaken = NO;
        }

 - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {

        //If the touch is taken or the gesture's already following a touch, say no.
        if (touchTaken | ([gestureRecognizer numberOfTouches] > 0)) {
            return NO;
        }
        else {
            touchTaken = YES;
            return YES;
        }
    }