我有一个水平滚动的UICollectionView,其中填充了垂直滚动的UITableView(两者都是UIScrollView的子类)。 当滚动手势开始向任何方向滚动时,在其减速完成之前不会识别其他手势识别器。
因此,如果我从一个tableView水平滚动到下一个,然后在减速完成之前尝试垂直滚动tableView,则它将继续水平滚动。 这非常令人沮丧。
我有一个水平滚动的UICollectionView,其中填充了垂直滚动的UITableView(两者都是UIScrollView的子类)。 当滚动手势开始向任何方向滚动时,在其减速完成之前不会识别其他手势识别器。
因此,如果我从一个tableView水平滚动到下一个,然后在减速完成之前尝试垂直滚动tableView,则它将继续水平滚动。 这非常令人沮丧。
您可以通过实现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,它们都有助于进一步完善手势行为。