添加双击到UICollectionView; 要求单击才能失败

Car*_*son 6 uigesturerecognizer uitapgesturerecognizer uicollectionview

对于这个问题有类似的问题,我试图在我的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];
Run Code Online (Sandbox Code Playgroud)

此代码无法按预期工作:tapGesture双击时触发,但不会阻止默认单击,并且didSelect...仍会调用委托的方法.

在调试器中单步执行会显示if条件[aRecognizer isKindOfClass:[UITapGestureRecognizer class]]永远不会计算为true,因此tapGesture未建立新的故障要求.

每次通过for循环运行此调试器命令:

po (void)NSLog(@"%@",(NSString *)NSStringFromClass([aRecognizer class]))
Run Code Online (Sandbox Code Playgroud)

揭示默认手势识别器(实际上)不是UITapGestureRecognizer实例.

相反,它们是私有类UIScrollViewDelayedTouchesBeganGestureRecognizerUIScrollViewPanGestureRecognizer.

首先,如果不违反有关私有API的规则,我无法明确使用这些内容.其次,附加到UIScrollViewDelayedTouchesBeganGestureRecognizer通道requireGestureRecognizerToFail:似乎无法提供所需的行为 - 即didSelect...仍然会调用委托.

如何使用UICollectionView默认手势识别器向集合视图添加双击并防止默认单击也触发委托collectionView:didSelectItemAtIndexPath:方法?

提前致谢!

Pau*_*nne 4

我的解决方案是不实现 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 上选择的,但如果这让您感到困扰,您可以在两个选择器中处理它。