仅捕获UIView的双指UIPanGestureRecognizer

10

我在我的视图控制器中有几个UIScrollView。 我想叠加一个视图,通过UIPanGestureRecognizer捕获两个手指划动的操作,但不会记录UIScrollView滑动手势。

当我用透明视图覆盖我的内容并使用2个手指进行平移手势时,我的轻触和1个手指划动操作都无法检测到。我尝试重写pointInside:方法并返回NO,但这样就无法记录我的2个手指的滑动操作。

效果类似于4个手指滑动以更改应用程序。


想让您的滚动视图不捕捉两个手指的滑动吗? - peko
@AndyJacobs,您想让滚动视图检测平移手势吗?您想添加一个覆盖层,它将检测两个手指的平移手势,而滚动视图则检测其他平移手势,对吗?如果我理解有误,请澄清一下。 - Pavan
2个回答

12

您不需要一个覆盖视图。


首先实现处理两根手指拖动的UIPanGestureRecognizer,并将其分配给包含UIScrollView的视图。

UIPanGestureRecognizer *panGestureRecognizer = [[UIPanGestureRecognizer alloc]
                                                initWithTarget:self 
                                                        action:@selector(handlePan:)];
panGestureRecognizer.delegate = self;
panGestureRecognizer.minimumNumberOfTouches = 2;
panGestureRecognizer.maximumNumberOfTouches = 2;
[self.view addGestureRecognizer:panGestureRecognizer];

使用 UIGestureRecognizerDelegate 处理带有 UIScrollView 平移手势的两个手指平移

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer
shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
    return YES;
}

最终,您能够处理两个手指的滑动操作

- (void)handlePan:(UIPanGestureRecognizer *)gestureRecognizer
{
    NSLog(@"pan");
}
如果您想在检测到两个手指滑动时停止滚动 UIScrollView,您可以禁用并启用 UIScrollView 滑动识别器。
- (void)handlePan:(UIPanGestureRecognizer *)gestureRecognizer
{
    if(gestureRecognizer.state == UIGestureRecognizerStateBegan)
    {
        _scrollView.panGestureRecognizer.enabled = NO;
    }
    if(gestureRecognizer.state == UIGestureRecognizerStateEnded)
    {
        _scrollView.panGestureRecognizer.enabled = YES;
    }
    NSLog(@"pan");
}

3

如果您不需要叠加层,只需使用手势识别即可解决此问题。我将其编写为测试:

- (void)viewDidLoad {
    [super viewDidLoad];

    self.scrollView = [[UIScrollView alloc] initWithFrame:self.view.bounds];
    _scrollView.contentSize = CGSizeMake(self.view.bounds.size.width * 2, self.view.bounds.size.height);

    UIView *green = [[UIView alloc] initWithFrame:self.view.bounds];
    [green setBackgroundColor:[UIColor greenColor]];

    UIView *blue = [[UIView alloc] initWithFrame:CGRectOffset(self.view.bounds, self.view.bounds.size.width, 0)];
    [blue setBackgroundColor:[UIColor blueColor]];

    [_scrollView addSubview:green];
    [_scrollView addSubview:blue];

    UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(twoFingerPan:)];
    [pan setMinimumNumberOfTouches:2];
    [pan setMaximumNumberOfTouches:2];
    [pan setDelaysTouchesBegan:YES];

    [_scrollView addGestureRecognizer:pan];

    [self.view addSubview:_scrollView];
}

- (void)twoFingerPan:(UIPanGestureRecognizer *)gesture {
    switch (gesture.state) {
        case UIGestureRecognizerStateBegan:
            self.scrollView.scrollEnabled = NO;
            break;
        case UIGestureRecognizerStateCancelled:
        case UIGestureRecognizerStateEnded:
        case UIGestureRecognizerStateFailed:
            self.scrollView.scrollEnabled = YES;
            break;
        default:
            break;
    }
    NSLog(@"2 Fingers!");
}

当使用两个手指时,我会收到twoFingerPan:回调。此时滚动视图的panGestureRecognizer仍在工作,因此我禁用了滚动视图上的滚动以处理二指平移。我发现这种方法效果不错。但有一件有点奇怪的事情是如果滚动视图正在减速,则不会调用2指手势识别器。希望这可以帮到你!


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