当UIScrollView减速时,GestureRecognizers未接收到触摸事件

时间:2014-06-24 01:38:42

标签: uiscrollview uiscrollviewdelegate

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

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

1 个答案:

答案 0 :(得分: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有助于进一步细化手势行为。