具有自定义单元格框架的 indexPathForItemAtPoint

indexPathForItemAtPoint with custom cell frame

我正在创建集合视图。我在 CollectionViewController 中更改单元格的大小和位置:

override func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath 
indexPath: NSIndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCellWithReuseIdentifier(
reuseIdentifier, forIndexPath: indexPath) as! MyCollectionViewCell

然后为每个单独的项目更改 cell.frame

        cell.frame = CGRectMake(x , y, width, height)

一切正常,但在使用手势识别器时,我想使用 collectionView.indexPathForItemAtPoint() 识别单元格。

collectionView.indexPathForItemAtPoint(),无法识别我对单元格大小和位置所做的更改,并且 returns 为零。它仅在我从(不可见的)原始位置拖动时有效。我找到了包括手动遍历所有单元格的解决方案,但我仍然想知道是否有可能以 collectionView.indexPathForItemAtPoint() 能够识别的方式更改单元格的位置和大小。

您看到这个的原因是 UICollectionView 没有使用实际的视图层次结构来回答您提出的问题。 UICollectionView 有一个布局对象,恰当地命名为 UICollectionViewLayout。默认布局对象是 UICollectionViewFlowLayout。当您在某个点请求单元格时,它会使用布局对象提供的信息。

重要的一点是:如果您想以不同于 Flow Layout 的方式放置单元格,则需要子class 它或基础 class 并实现您自己的布局方法。或者,您可以获得与您的更改同步的默认流布局对象。我不确定。

这不是微不足道的,而且我没有一个简单的开箱即用的解决方案来满足您的需求。你必须仔细研究它并在进行时提出具体问题。 Here 是子class 流式布局允许重新排序的示例,这可能对您有所帮助。