禁用手势识别器

42

我有两种识别器,一种是用于轻触的,另一种是用于滑动的。

UIGestureRecognizer *recognizer;

//TAP
recognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(numTap1:)];
[(UITapGestureRecognizer *)recognizer setNumberOfTouchesRequired:1];
[self.view addGestureRecognizer:recognizer];
self.tapRecognizer = (UITapGestureRecognizer *)recognizer;
recognizer.delegate = self;
[recognizer release];

//SWIPE RIGHT
recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipeRight:)];
self.swipeRightRecognizer =(UISwipeGestureRecognizer *)recognizer;
swipeRightRecognizer.direction = UISwipeGestureRecognizerDirectionRight;
[self.view addGestureRecognizer:swipeRightRecognizer];
self.swipeRightRecognizer = (UISwipeGestureRecognizer *)recognizer;
[recognizer release];

使用这个函数可以禁用某些对象上的点击。

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

if ((touch.view == loseView) || (touch.view == subBgView) || (touch.view == btnAgain)) {

    return NO;
}

return YES;
}

我该如何禁用滑动?

非常感谢!

3个回答

124

UIGestureRecognizer有一个名为enabled的属性。这应该足以禁用您的轻扫手势:

swipeGestureRecognizer.enabled = NO;

编辑:对于Swift 5

swipeGestureRecognizer.isEnabled = false

1
@PeyloW:+1 我本以为我需要将它删除并重新添加到视图中。 - Unheilig
3
此外,您可以将userInteractionEnabled属性设置为NO,应用于手势所附加的视图上。如果您正在使用某种覆盖层并希望禁用底层内容,这非常方便。这也将根据视图的hidden和alpha值自动切换。 - ima747

17
为什么不为滑动手势识别器设置代理,并在同一个代理方法中处理它们呢?请注意保留HTML标记。
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
    if ( [gestureRecognizer isMemberOfClass:[UITapGestureRecognizer class]] ) {
        // Return NO for views that don't support Taps
    } else if ( [gestureRecognizer isMemberOfClass:[UISwipeGestureRecognizer class]] ) {
        // Return NO for views that don't support Swipes
    }

    return YES;
}

0

我有一个类似的问题。我的一些残障用户同时点击和滑动,导致应用程序跳转到下一个屏幕。我设置了一个选项,允许他们使用三个手指轻触代替。我需要在popoverControllerDidDismissPopover委托和应用程序首次启动时调用该选项。因此,我编写了一个方法,结合了上面的答案。它查找所有滑动手势识别器并将其关闭,然后打开我的轻触手势识别器。

- (void)changeGestureRecognizer {
    // Three finger tap to move to next screen
    if ([Globals sharedInstance].useDoubleTapToMoveToNextScreen) {

        // Let’s see which gestures are active and turn off the swipes
        for (UIGestureRecognizer *gestureRecognizer in self.view.gestureRecognizers) {
            NSLog(@"The gestureRecognizer is %@", gestureRecognizer);
            if ( [gestureRecognizer isMemberOfClass:[UISwipeGestureRecognizer class]] ) gestureRecognizer.enabled = NO;
        }
        // Add the three finger tap
        UITapGestureRecognizer *twoFingerTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeNext)];
        [twoFingerTap setNumberOfTapsRequired:1];
        [twoFingerTap setNumberOfTouchesRequired:3];
        [self.view addGestureRecognizer:twoFingerTap];

    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接