【问题标题】:UICollectionViewCell Respond to Multiple Gesture RecognizersUICollectionViewCell 响应多个手势识别器
【发布时间】:2013-09-03 15:51:02
【问题描述】:

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

我的第一个想法是向单元格添加两个手势识别器,一个用于滑动,一个用于点击,但我不确定开始向 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 视图中之前工作。内容出现后,只有网页视图的滚动才有效。

【问题讨论】:

  • 你有一些代码要显示吗?我会添加第二个手势并使用requireGestureRecognizerToFail
  • 我没有任何代码 - 我不知道如何开始处理这个问题。我知道如何将手势识别器添加到一般视图中,但在这里我迷路了。假设我向单元格添加了一个点击手势。然后我使用requireGestureRecognizerToFail,如何访问滚动视图的滑动手势识别器以作为参数添加到此方法?我知道如何访问 scrollView.gestureRecognizers,但这无济于事。

标签: ios uiscrollview uigesturerecognizer uicollectionview uicollectionviewcell


【解决方案1】:

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

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

【讨论】:

  • 我尝试了这种方法 - 似乎它应该可以工作,但我无法让两个手势同时工作。我已经编辑了我的问题以显示我正在使用的代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-08
相关资源
最近更新 更多