我有一个UICollectionView
实现自定义UICollectionViewCells
的基于网格的布局。为了允许单元格响应拖动,我单独向每个单元格添加UIPanGestureRecognizer
。
当我触摸时,UICollectionView
仍然滚动(水平)并从单元格之间的点开始向左/向右滑动,但只要将平移手势识别器添加到单元格中,它就像{{1当我开始在单元格内轻击时,拒绝滚动。
现在,我将水平左/右拖动与垂直向上/向下拖动分开,因此拖出单元格(垂直滑动)和滚动CollectionView
(水平滑动)之间不应存在任何冲突。在这种情况下,如何将滑动传递到集合/滚动视图,以便它知道像正常一样滚动?不得不开始在细胞之间的边界或间隔上,这真的很烦人。
一旦我从一个单元格中移除了平移手势,无论我是开始在单元格上还是在单元格之间滑动,滚动都会正常工作。
编辑:下面发布的所需平移手势行为为当前代码
CollectionView
此代码适用于每个单独的单元格。当它连接到UICollectionView作为其手势识别器时它不起作用,它实际上停止了所有滚动。
答案 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;