UICollectionViewCell响应多个手势识别器

时间:2013-08-30 20:28:39

标签: ios uiscrollview uigesturerecognizer uicollectionview uicollectionviewcell

我有一个UICollection视图,它实现了“didSelectItemAtIndexPath ...”方法。选择(轻击)单元格后,将转换到另一个视图控制器。但是,每个单元格还包含垂直滚动视图。我希望用户可以选择与每个单元格进行交互,以便垂直滑动以查看滚动视图的内容,或者点击一次以选择单元格。

我的第一个想法是向单元格添加两个手势识别器,一个用于滑动,一个用于点击,但我不确定是否开始向UICollectionView和scrollview添加更多手势识别器是一个好主意。我也不确定如何将滑动手势与滚动视图的滚动动作联系起来。

我找到了这个资源:http://uncorkedstudios.com/2013/05/03/using-uigesturerecognizers-with-uicollectionviews/,建议使用requireGestureRecognizerToFail。

在使用上述两种方法进行黑客攻击之后,我觉得不知道如何做到这一点,更重要的是,如何正确地做到这一点。 任何人都可以提出一个明智的策略,让每个UICollectionViewCell通过单独的操作响应两个独特的手势吗?

修改 我尝试了以下方法来解决这个问题,但仍然无法让两个手势识别器协同工作:

1)到我的集合视图单元格(UICollectionViewCell的子类)我添加了一个我在init方法中设置的UITapGestureRecognizer属性:

self.tap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(cellWasTapped:)]; 
self.tap.delegate = self; //this class is a UIGestureRecognizerDelegate 

2)方法cellWasTapped

- (void)cellWasTapped:(UITapGestureRecognizer *)sender
{
    NSLog(@"this cell was tapped!"); //temporary
}

3)由于滚动视图是webView滚动视图,我在webView委托方法的末尾添加了手势识别器代码:

- (void)webViewDidFinishLoad:(UIWebView *)webView
{
    [self.overlayView removeFromSuperview];
    CGSize contentSize = self.webView.scrollView.contentSize;
    CGSize viewSize = self.webView.bounds.size;
    float rw = viewSize.width / contentSize.width;
    self.webView.scrollView.minimumZoomScale = rw;
    self.webView.scrollView.maximumZoomScale = rw;
    self.webView.scrollView.zoomScale = rw;
    self.webView.scrollView.scrollEnabled = YES;
    self.webView.scrollView.contentOffset = CGPointMake(0, 0);
    self.webView.scrollView.size = CGSizeMake(self.webView.scrollView.contentSize.width,    
    self.webView.scrollView.contentSize.height - 5);
    self.webView.scrollView.delegate = self;

    [self addGestureRecognizer:self.tap];
    [self.tap requireGestureRecognizerToFail:self.webView.scrollView.panGestureRecognizer];
}

问题是,点击手势识别器仅在webView内容出现在Web视图中之前有效。显示内容后,仅滚动Web视图。

1 个答案:

答案 0 :(得分:1)

滚动视图具有panGestureRecognizer属性,您可以访问此属性以与新的点按手势建立requireGestureRecognizerToFail关系。添加新的点击手势后,您的所有点击处理都将从当前的委托方法移动。

您还应该实施gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer:以允许所有识别器同时运行。