首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >向UICollectionView中添加双击;要求单个抽头失败

向UICollectionView中添加双击;要求单个抽头失败
EN

Stack Overflow用户
提问于 2013-07-16 08:22:38
回答 2查看 4.1K关注 0票数 6

有一个与this question类似的问题,我试图在我的UICollectionView实例中添加一个双击手势识别器。

我需要防止默认的单个抽头调用UICollectionViewDelegate方法collectionView:didSelectItemAtIndexPath:

为了实现这一点,我实现了代码 (Listing 4-2)

UITapGestureRecognizer* tapGesture = [UITapGestureRecognizer alloc initWithTarget:self action:@selector(handleTapGesture:)];NSArray*识别器= self.collectionView gestureRecognizers;//使默认手势识别器等待自定义手势识别器失败。对于(UIGestureRecognizer* aRecognizer in识别器){ if ([aRecognizer isKindOfClass:UITapGestureRecognizer类]) aRecognizer要求requireGestureRecognizerToFail:tapGesture;}/现在将手势识别器添加到集合视图中。tapGesture.numberOfTapsRequired = 2;self.collectionView加载机:tapGesture;

此代码不像预期的那样工作:tapGesture在双抽头上触发,但是没有阻止默认的单个抽头,并且仍然调用委托的didSelect...方法。

在调试器中的步骤显示,if条件[aRecognizer isKindOfClass:[UITapGestureRecognizer class]]从不计算为true,因此没有建立对新tapGesture的故障需求。

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

代码语言:javascript
复制
po (void)NSLog(@"%@",(NSString *)NSStringFromClass([aRecognizer class]))

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

相反,它们是私有类UIScrollViewDelayedTouchesBeganGestureRecognizerUIScrollViewPanGestureRecognizer

首先,我不能在不违反关于私有API的规则的情况下显式地使用这些。其次,通过UIScrollViewDelayedTouchesBeganGestureRecognizer附加到requireGestureRecognizerToFail:似乎并没有提供所需的行为,即仍然调用委托的didSelect...

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

提前感谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-08-03 17:16:05

我的解决方案不是实现收藏品视图:didSelectItemAtIndexPath,而是实现两个手势识别器。

代码语言:javascript
复制
    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];

这样我就能处理单一的和双的水龙头了。我唯一能看到的问题是,这个单元格是在doubleTaps上选择的,但是如果这让你烦恼,你可以在你的两个选择器中处理它。

票数 4
EN

Stack Overflow用户

发布于 2015-02-03 10:57:07

我使用以下方法注册一个UITapGestureRecognizer:

代码语言:javascript
复制
UITapGestureRecognizer* singleTapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTapGesture:)];
singleTapGesture.delaysTouchesBegan = YES;
singleTapGesture.numberOfTapsRequired = 1; // number of taps required
singleTapGesture.numberOfTouchesRequired = 1; // number of finger touches required
[self.collectionView addGestureRecognizer:singleTapGesture];

通过将delaysTouchesBegan设置为YES,自定义手势识别器通过延迟其他触摸事件的注册来获得优先于默认集合视图的轻量级侦听器。或者,您可以通过将cancelsTouchesInView设置为YES来设置完全取消触摸识别。

该手势由以下函数处理:

代码语言:javascript
复制
- (void)handleSingleTapGesture:(UITapGestureRecognizer *)sender {

    if (sender.state == UIGestureRecognizerStateEnded) {
        CGPoint location = [sender locationInView:self.collectionsView];
        NSIndexPath *indexPath = [self.collectionsView indexPathForItemAtPoint:location];

        if (indexPath) {
            NSLog(@"Cell view was tapped.");
            UICollectionViewCell *cell = [self.collectionsView cellForItemAtIndexPath:indexPath];
            // Do something.                
        }
    }
    else{
        // Handle other UIGestureRecognizerState's
    }
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17671498

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档