由于与此问题类似的问题,我正在尝试将双击手势识别器添加到我的UICollectionView实例中。
我需要防止默认单击调用该UICollectionViewDelegate方法collectionView:didSelectItemAtIndexPath:。
为了实现这一点,我直接从 Apple 的Collection View Programming Guide(清单 4-2)中实现了代码:
UITapGestureRecognizer* tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTapGesture:)]; NSArray* recognizers = [self.collectionView gestureRecognizers]; // Make the default gesture recognizer wait until the custom one fails. for (UIGestureRecognizer* aRecognizer in recognizers) { if ([aRecognizer isKindOfClass:[UITapGestureRecognizer class]]) [aRecognizer requireGestureRecognizerToFail:tapGesture]; } // Now add the gesture recognizer to the collection view. tapGesture.numberOfTapsRequired = 2; [self.collectionView addGestureRecognizer:tapGesture];
此代码未按预期工作:tapGesture双击时触发,但不阻止默认单击,并且didSelect...仍调用委托的方法。
在调试器中单步执行会发现 if 条件 ,[aRecognizer isKindOfClass:[UITapGestureRecognizer class]]永远不会计算为真,因此新的故障要求tapGesture没有建立。
每次通过 for 循环运行此调试器命令:
po (void)NSLog(@"%@",(NSString *)NSStringFromClass([aRecognizer class]))
揭示了默认手势识别器(确实)不是UITapGestureRecognizer实例。
相反,它们是私有类UIScrollViewDelayedTouchesBeganGestureRecognizer和UIScrollViewPanGestureRecognizer.
首先,我不能在不违反私有 API 规则的情况下明确使用这些。其次,附加到UIScrollViewDelayedTouchesBeganGestureRecognizer通孔requireGestureRecognizerToFail:似乎无论如何都不能提供所需的行为——即didSelect...仍然调用委托的。
如何使用UICollectionView的默认手势识别器向集合视图添加双击并防止默认单击也触发委托的collectionView:didSelectItemAtIndexPath:方法?
提前致谢!