Car*_*son 6 uigesturerecognizer uitapgesturerecognizer uicollectionview
对于这个问题有类似的问题,我试图在我的UICollectionView实例中添加双击手势识别器.
我需要阻止默认单击调用UICollectionViewDelegate方法collectionView:didSelectItemAtIndexPath:.
为了实现这一点,我直接从Apple的Collection View Programming Guide(清单4-2)实现代码:
Run Code Online (Sandbox Code Playgroud)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]]永远不会计算为true,因此tapGesture未建立新的故障要求.
每次通过for循环运行此调试器命令:
po (void)NSLog(@"%@",(NSString *)NSStringFromClass([aRecognizer class]))
Run Code Online (Sandbox Code Playgroud)
揭示默认手势识别器(实际上)不是UITapGestureRecognizer实例.
相反,它们是私有类UIScrollViewDelayedTouchesBeganGestureRecognizer和UIScrollViewPanGestureRecognizer.
首先,如果不违反有关私有API的规则,我无法明确使用这些内容.其次,附加到UIScrollViewDelayedTouchesBeganGestureRecognizer通道requireGestureRecognizerToFail:似乎无法提供所需的行为 - 即didSelect...仍然会调用委托.
如何使用UICollectionView默认手势识别器向集合视图添加双击并防止默认单击也触发委托collectionView:didSelectItemAtIndexPath:方法?
提前致谢!
我的解决方案是不实现 collectionView:didSelectItemAtIndexPath 而是实现两个手势识别器。
self.doubleTapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(processDoubleTap:)];
[_doubleTapGesture setNumberOfTapsRequired:2];
[_doubleTapGesture setNumberOfTouchesRequired:1];
[self.view addGestureRecognizer:_doubleTapGesture];
self.singleTapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(processSingleTap:)];
[_singleTapGesture setNumberOfTapsRequired:1];
[_singleTapGesture setNumberOfTouchesRequired:1];
[_singleTapGesture requireGestureRecognizerToFail:_doubleTapGesture];
[self.view addGestureRecognizer:_singleTapGesture];
Run Code Online (Sandbox Code Playgroud)
这样我就可以处理单击和双击。我能看到的唯一问题是单元格是在 doubleTaps 上选择的,但如果这让您感到困扰,您可以在两个选择器中处理它。
| 归档时间: |
|
| 查看次数: |
3737 次 |
| 最近记录: |