如何仅检测单元格而不是整个集合视图的点击?

How to detect tap only on cells not on whole collection view?

我的应用程序中有 collectionView。我有一个要求,我应该能够双击和单击单元格来执行不同的操作。为了使 collectionView 上的双击和单击手势成为可能,我在集合视图上添加了手势并通过以下代码获取了位置。

-(void)handleSingleTap:(UITapGestureRecognizer *)gestureRecognizer
{
  if([arr_userAlbums count]>0)
  {
    if (gestureRecognizer.state != UIGestureRecognizerStateEnded)
    {
      return;
    }
    p = [gestureRecognizer locationInView:self.collection_view];

    NSIndexPath *indexPath = [self.collection_view indexPathForItemAtPoint:p];

    celltTapped_index_path=indexPath;
  }
}

-(void)handleDoubleTap:(UITapGestureRecognizer *)gestureRecognizer
{
  if([arr_userAlbums count]>0)
  {
    if (gestureRecognizer.state != UIGestureRecognizerStateEnded)
    {
      return;
    }
    p = [gestureRecognizer locationInView:self.collection_view];

    NSIndexPath *indexPath = [self.collection_view indexPathForItemAtPoint:p];

    celltTapped_index_path=indexPath;
  }
}

但在这种情况下,即使单元格不可见,整个屏幕也接受双击和单击。我只想检测单元格而不是整个集合视图的单击和双击。

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{

 static NSString *cellIdentifier = @"cvCell";
 customCell *cell = (customCell *)[collectionView dequeueReusableCellWithReuseIdentifier:cellIdentifier forIndexPath:indexPath];

 cell.img_Collection.image = [imgArray objectAtIndex:indexPath.row];
 cell.lbl_Collection.text = [lblArray objectAtIndex:indexPath.row];

 cell.tag = indexPath.row;

 UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTap:)];
 singleTap.numberOfTapsRequired = 1;
 singleTap.delaysTouchesEnded = YES;

 UITapGestureRecognizer *doubleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleDoubleTap:)];
 doubleTap.numberOfTapsRequired = 2;


 [singleTap requireGestureRecognizerToFail:doubleTap];

 [cell addGestureRecognizer:singleTap];
 [cell addGestureRecognizer:doubleTap];

 return cell;
}



-(void)handleSingleTap:(UIGestureRecognizer *)recognizer
{
   NSLog(@"The single tap happened for %ld th index",recognizer.view.tag);
}


-(void)handleDoubleTap:(UIGestureRecognizer *)recognizer
{
  NSLog(@"The Double tap happened for %ld th index",recognizer.view.tag);
}

您可以使用这样的 hitTest 方法获得点击视图

UIView *tappedView = [self hitTest:yourLocation forEvents:nil];

这将 return 您点击的视图 用 if 条件检查这个

if(tappedView == Imageview)
{
    // do this
}
else if(tappedView == CollectionViewCell)
{
    // do this
}