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

7
我已经在集合视图上附加了一个UILongPressGestureRecognizer,目的是让用户长按单元格并被询问是否要删除它。但问题在于我无法像处理表格单元格那样获取indexPath(使用indexPathForRowAtPoint),是否有相应方法来解决?如果没有,我考虑将手势添加到每个单元格中,但如何识别手势(我看不到手势的“tag”)?例如,我能否在选择器中发送indexPath.item?或者其他方法?
2个回答

17

UICollectionView 上同样可以使用这个方法。根据文档

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

  • (NSIndexPath *)indexPathForItemAtPoint:(CGPoint)point 参数 point:集合视图坐标系中的一点。 返回值:指定点处项目的索引路径,如果指定点未找到项目,则返回nil。

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

可用性:iOS 6.0及更高版本可用。在UICollectionView.h文件中声明。


我也尝试了ForItem,但它告诉我没有可见的接口。经过仔细检查,我发现我试图在一个与UIColectionView名称相近的UIView上实现它。我真是个笨蛋,没有注意到这一点,也没有起更好的名字...感谢提醒我。 - Recycled Steel

3
请注意,有时获得的CGPoint是基于UIViewController参考系统的,只要没有涉及滚动操作,它就可以正常工作。当涉及到滚动操作时,您需要通过添加滚动偏移量来将该点转换为可滚动视图中的真实点。
在本例中,CGPoint来自包含一个UICollectionView的整个UIViewController中的3DTouch。
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
}

正是我遇到的问题(但是使用Xamarin.iOS),并且这已经解决了问题。但是现在当我使用3D Touch时,源单元格的初始轮廓会显示为预览进入视图。因此,为了更好地澄清这一点,如果我强制按下单元格项,则预览开始进入视图,但从原始单元格的偏移位置开始扩展。 - Tahari
只是对我之前评论的更新(发布后才想到),如果您在RegisterForPreviewingWithDelegate中注册UICollectionView本身,则不再需要偏移量.. 因此,Xamarin.iOS代码如下: RegisterForPreviewingWithDelegate(new PhotoPreviewingDelegate(this), this.CollectionView); - Tahari
1
我点赞是因为你的回答指引了我正确的方向,但对我有用的是将CGPoint从我的view坐标系转换为我的collectionView坐标系。let actualLocation = view.convert(location, to: collectionView) - M-P
1
@MichaelPatzer 这就是我们的想法。找到解决方案的路径。我也给你点了赞 ;) - Julio Bailon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接