如何从UICollectionViewCell将pan手势传递给UICollectionVIew?

时间:2014-05-21 06:59:41

标签: ios objective-c foundation

我有一个UICollectionView实现自定义UICollectionViewCells的基于网格的布局。为了允许单元格响应拖动,我单独向每个单元格添加UIPanGestureRecognizer

当我触摸时,UICollectionView仍然滚动(水平)并从单元格之间的点开始向左/向右滑动,但只要将平移手势识别器添加到单元格中,它就像{{1当我开始在单元格内轻击时,拒绝滚动。

现在,我将水平左/右拖动与垂直向上/向下拖动分开,因此拖出单元格(垂直滑动)和滚动CollectionView(水平滑动)之间不应存在任何冲突。在这种情况下,如何将滑动传递到集合/滚动视图,以便它知道像正常一样滚动?不得不开始在细胞之间的边界或间隔上,这真的很烦人。

一旦我从一个单元格中移除了平移手势,无论我是开始在单元格上还是在单元格之间滑动,滚动都会正常工作。

编辑:下面发布的所需平移手势行为为当前代码

CollectionView

此代码适用于每个单独的单元格。当它连接到UICollectionView作为其手势识别器时它不起作用,它实际上停止了所有滚动。

2 个答案:

答案 0 :(得分:10)

不是将UIPanGestureRecognizer附加到每个单元格(这会降低性能),而是向UIPanGestureRecognizer添加UICollectionView,当发生平移手势时,使用locationInView来获取指向平移开始的UICollectionView,然后indexPathForItemAtPoint,它将返回您应设置动画的单元格的索引路径。

这样,您的整个集合视图中只有一个手势识别器(好!),同时在视图控制器中保持控制(如您所愿) - 双赢!

使用此解决方案,您可以在视图控制器中实现gestureRecognizer:shouldReceiveTouch:,抓住给定的gestureRecognizer,确保它是您的UIPanGestureRecognizer并使用其translationInView:方法查找如果平移在X轴或Y轴上。使用该信息来决定是否要返回YES或NO。例如:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
  if([gestureRecognizer isEqual:myTapGesture]) {
    CGPoint point = [gestureRecognizer translationInView:self.collectionView];
    if(point.x != 0) { //adjust this condition if you want some leniency on the X axis
      //The translation was on the X axis, i.e. right/left, 
      //so this gesture recognizer shouldn't do anything about it
      return NO;
    }
  }
  return YES;
}

答案 1 :(得分:5)

使用-shouldReceiveTouch:和-shouldRecognizeSimultaneouslyWithGestureRecognizer:返回YES,将UIGestureRecognizerDelegate添加为您的类协议列表,并将您的手势委托委托给self in -viewDidLoad。

yourGesture.delegate = self;