1

我有一个 UICollection 视图,它实现了“didSelectItemAtIndexPath ...”方法。When the cell is selected (tapped), a transition is made to another view controller. 但是,每个单元格还包含一个垂直滚动视图。我希望用户可以选择与每个单元格交互以垂直滑动以查看滚动视图的内容,或者点击一次以选择单元格。

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

我找到了这个资源: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 视图的滚动有效。

4

1 回答 1

2

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

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

于 2013-08-30T21:04:23.813 回答