0

我有一个附加了四个平移手势的视图。第一个将最大和最小触摸数设置为 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");

    }
}

应该发生的是,每当抬起任何手指时,我都会在控制台中看到“结束”。相反,在所有手指都抬起之前,我什么也看不到,此时我看到“结束”重复了四次(或与屏幕上的手指一样多)。

有什么办法可以按照我的意图进行这项工作吗?

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

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

4

2 回答 2

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");
     }
}
于 2013-08-01T23:55:28.967 回答
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;
        }
    }
于 2013-08-05T16:37:41.110 回答