2013-07-17 48 views
5

我已将UILongPressGestureRecognizer附加到收集视图,其目的是让用户将手指放在表格中的某个单元格上,并询问他们是否要删除它。在UICollectionView中点击位置后识别单元格

我遇到的问题是我不能像表格单元格一样获取indexPath(使用indexPathForRowAtPoint),是否有等价的?

如果不是我曾经想过为每个单元添加手势,但是如何识别哪个手势(我看不到手势的“标记”),例如,我可以在选择器中发送indexPath.item吗?或者其他一些方法?

回答

15

你在UICollectionView上得到了同样的结果。按照documentation

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

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

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

Availability在iOS 6.0及更高版本可用。宣布 UICollectionView.h

+0

我试图ForItem以及和它告诉我,有没有明显的界面,并在接近一个UICollectionView整体的UIViewController检查我发现我试图在与UIColectionView名称相同的UIView上执行此操作。我是一个白痴,没有注意到,也没有更好地命名......感谢您的支持。 –

+0

这非常有用,谢谢。 – StackRunner

3

请注意,你有时CGPoint在UIViewController中参考系统快到了,只要没有参与滚动工作。当涉及滚动时,您需要通过添加滚动的偏移量来将点转换为可滚动视图中的实际点。

在这个例子中CGPoint从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 
} 
+0

正是我遇到的问题(但使用Xamarin.iOS),这已经解决了这个问题。但是现在,当我使用3D Touch时,当预览进入视图时,源单元格的初始轮廓会显示。因此,为了更好地阐明这一点,如果我强制触摸单元格项目,预览开始进入视图,但在原始单元格位于偏移量之前的位置开始展开。 – Tahari

+0

只是我以前的评论(我刚刚发布后发现)的更新,是如果你注册UICollectionView本身在RegisterForPreviewingWithDelegate,那么偏移量不再需要了..因此Xamarin.iOS代码是: ' RegisterForPreviewingWithDelegate(新PhotoPreviewingDelegate(this),this.CollectionView); ' – Tahari

+1

我向上投票,因为你的回答让我朝着正确的方向发展,但是对我来说有效的是将'CGPoint'从我的'view'坐标转换为''collectionView'坐标。 '让actualLocation = view.convert(location,to:collectionView)' –

相关问题