UIScrollView在减速时,GestureRecognizers无法接收到触摸事件

4

我有一个水平滚动的UICollectionView,其中填充了垂直滚动的UITableView(两者都是UIScrollView的子类)。 当滚动手势开始向任何方向滚动时,在其减速完成之前不会识别其他手势识别器。

因此,如果我从一个tableView水平滚动到下一个,然后在减速完成之前尝试垂直滚动tableView,则它将继续水平滚动。 这非常令人沮丧。

1个回答

4

您可以通过实现UIGestureRecognizerDelegate方法来使得两个手势识别器同时工作:

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

然而,由于UIScrollView的内置手势识别器的代理必须是UIScrollView本身,因此您必须子类化UIScrollView(或UITableView,或UICollectionView)来实现此代理方法。

这有点违背了委托的目的。

无论如何,现在两个UIScrollViews同时识别手势,我们需要一种方法来区分水平和垂直滚动手势,并确保适当的滚动视图处理适当的手势。

一个快速的解决方案是创建一个垂直滑动手势识别器,并要求它失败,以便水平集合视图的内置手势识别器能够识别。

UISwipeGestureRecognizer* verticalSwipe = [[UISwipeGestureRecognizer alloc] init];
verticalSwipe.direction = UISwipeGestureRecognizerDirectionDown | UISwipeGestureRecognizerDirectionUp;
verticalSwipe.delegate = self;
for (UIGestureRecognizer *gesture in self.collectionView.gestureRecognizers){
    [gesture requireGestureRecognizerToFail:verticalSwipe];
}
[self.collectionView addGestureRecognizer:verticalSwipe];

然后对于垂直的tableView做同样的操作,添加一个水平滑动手势,并要求它失效以使tableView内置的识别器生效。

    UISwipeGestureRecognizer* horizontalSwipe = [[UISwipeGestureRecognizer alloc] init];
    horizontalSwipe.direction = UISwipeGestureRecognizerDirectionLeft | UISwipeGestureRecognizerDirectionRight;
    horizontalSwipe.delegate = self;
    for (UIGestureRecognizer *gesture in tableView.gestureRecognizers){
        [gesture requireGestureRecognizerToFail:horizontalSwipe];
    }
    [tableView addGestureRecognizer:horizontalSwipe];

添加:

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

对于collectionView和tableView,它们都有助于进一步完善手势行为。


1
在iOS8中,滚动视图默认情况下似乎会返回NO以取消内容视图中的触摸事件。为了使上述功能在iOS8上正常工作,您必须在您的UIIScrollView子类中覆盖此方法并返回YES,否则任何UIControl内容都会破坏行为。 - vladimir computin

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