如何在所有单元格周围的空白区域接收UICollectionView的触摸

我有一个UICollectionView有不同的项目。 当我点击一个项目,我使用:

  -(void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath 

找出什么被触动,然后基本上设置该视图的α为0来隐藏它。 这一切工作正常。 现在我想要做的是当你点击围绕所有UICollectionViewCell所有的视图再次出现。 我很难find一种方法,可以让我知道单元格周围的空白区域何时被触摸。 有没有一个很好的方法来做到这一点? 我曾尝试设置一个手势识别器,但是当我这样做,我的方法

  -(void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath 

不叫。 是否有一些方法来实现手势识别器,并从那里确定是否点击一个单元格,如果隐藏该单元格,否则显示所有隐藏的单元格? 谢谢。

我已经设法通过在UICollectionView backgroundView上使用UITapGestureRecognizer来解决这个问题。 这是在斯威夫特,但这个想法是明确的:

 self.tapGestureRecognizer = UITapGestureRecognizer(target: self, action: "handleTap:") self.tapGestureRecognizer.delegate = self self.collectionView.backgroundView = UIView(frame:self.collectionView.bounds) self.collectionView.backgroundView!.addGestureRecognizer(tapGestureRecognizer) 

而callback:

 func handleTap(recognizer: UITapGestureRecognizer) { // Handle the tap gesture } 

我在我的项目中遇到了类似的情况,并通过执行以下操作来解决它:

 let tapGestureRecogniser = UITapGestureRecognizer(target: self, action: #selector(handleTapEmptySpaceGesture)) tapGestureRecogniser.delegate = self collectionView.addGestureRecognizer(tapGestureRecogniser) 

实现UIGestureRecognizerDelegate协议

然后在协议中实现以下function:

 func gestureRecognizerShouldBegin(gestureRecognizer: UIGestureRecognizer) -> Bool { // only handle tapping empty space (ie not a cell) let point = gestureRecognizer.locationInView(collectionView) let indexPath = collectionView.indexPathForItemAtPoint(point) return indexPath == nil } 

基本上,如果点击是在一个单元格上,那么你的手势识别器不会开始,允许正常的select/取消select代表运行。 否则,如果它是空的空间,您的识别器处理水龙头,并运行其处理程序。

只有当用户selectcollectionViewCell时,才会调用didSelectItem委托方法。 单元格之间的空间可能因每个单元格的大小而异,您可以指定最小间距。 通过改变它的zindex接收触摸保持作为backgroundView的补充视图,添加触摸检测。 希望这会帮助你。 🙂

这在Swift 2.3中适用于我

步骤1:实现UIGestureRecognizerDelegate协议

第2步:在UICollectionView backgroundView上设置UITapGestureRecognizer

第3步:处理在tapTap函数里面点击什么

 class namScreenVcc: UICollectionViewController, UIViewControllerTransitioningDelegate, UIGestureRecognizerDelegate { override func viewDidLoad() { super.viewDidLoad() let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(handleTap(_:))) tapGestureRecognizer.delegate = self collectionView!.backgroundView = UIView(frame: collectionView!.bounds) collectionView!.backgroundView!.addGestureRecognizer(tapGestureRecognizer) } func handleTap(recognizer: UITapGestureRecognizer) { // Handle the tap gesture } }