在UICollectionView中点击位置后识别单元格

时间:2013-07-17 10:47:19

标签: ios uicollectionview uicollectionviewcell long-press

我已将UILongPressGestureRecognizer附加到集合视图,目的是让用户将手指放在表格中的单元格上,并询问他们是否要删除它。

我遇到的问题是我无法像使用表格单元格那样获取indexPath(使用indexPathForRowAtPoint),是否存在等价物?

如果不是,我已经考虑过将手势添加到每个单元格,但是我如何识别哪个手势(我看不到手势的“标签”),例如我可以在选择器中发送indexPath.item吗?还是其他一些方法?

2 个答案:

答案 0 :(得分:16)

UICollectionView上有同样的事情。根据{{​​3}}:

  

indexPathForItemAtPoint:返回项目的索引路径   集合视图中的指定点。

     
      
  • (NSIndexPath *)indexPathForItemAtPoint:(CGPoint)point参数point集合视图坐标系中的一个点。回报价值   指定点处项目的索引路径,如果没有项目则为nil   在指定点被发现。
  •   
     

讨论此方法依赖于提供的布局信息   关联的布局对象,以确定哪个项包含   点。

     

可用性适用于iOS 6.0及更高版本。宣告进入   UICollectionView.h

答案 1 :(得分:3)

请注意,有时你得到的CGPoint会进入UIViewController参考系统并且只要不涉及滚动就可以工作。当涉及滚动时,您需要通过添加滚动的偏移量将点转换为可滚动视图中的实际点。

在这个例子中,CGPoint来自整个UIViewController中的3DTouch,里面包含一个UICollectionView

public func previewingContext(_ previewingContext: UIViewControllerPreviewing, viewControllerForLocation location: CGPoint) -> UIViewController?{
    let offsetPoint = self.musicCollectionVw.contentOffset
    let realLocation = CGPoint(x: location.x + offsetPoint.x, y: location.y + offsetPoint.y)
    if let indexPath = self.musicCollectionVw.indexPathForItem(at: realLocation){
        NSLog("Section: \(indexPath.section) Row: \(indexPath.row)")
    }
    return nil
}