您可以通过实现 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 都有助于进一步完善手势行为。