我有一个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视图。
答案 0 :(得分:1)
滚动视图具有panGestureRecognizer
属性,您可以访问此属性以与新的点按手势建立requireGestureRecognizerToFail
关系。添加新的点击手势后,您的所有点击处理都将从当前的委托方法移动。
您还应该实施gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer:
以允许所有识别器同时运行。