我有一个水平滚动的UICollectionView,其中填充了垂直滚动的UITableViews(都是UISCrollView的子类)。当滚动手势开始向任一方向滚动时,在其完成减速之前不会识别其他手势识别器。
因此,如果我从一个tableView水平滚动到下一个tableView,然后尝试在减速完成之前垂直滚动tableview,它将继续水平滚动。这非常令人沮丧。
答案 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有助于进一步细化手势行为。