在iOS7中重新排序UICollectionView

时间:2016-04-24 09:20:08

标签: ios objective-c uicollectionview

我想构建一个UICollectionView,或者使用类似的库来制作网格视图,我可以在其中重新排列单元格。我的应用支持iOS 7,不幸的是UICollectionView方法 - (BOOL)beginInteractiveMovementForItemAtIndexPath:(NSIndexPath *)indexPath 仅适用于iOS 9及更高版本。

有什么方法可以在iOS7上实现“拖动和重新排序”集合视图单元格的效果?感谢。

1 个答案:

答案 0 :(得分:8)

好吧,我碰巧遇到了同样的问题,所以让我加上我的两分钱。

为了获得与重组细胞时UIKit所做的相同的效果,我采用了或多或少类似的方法:

  1. 将长按手势识别器添加到集合视图中 你可以检测到哪个细胞被窃听而没有弄乱 使用collectionView:didSelectItemAtIndexPath方法。

  2. 当用户长按单元格时,请截取该单元格的屏幕截图,将快照视图添加到集合视图中,然后隐藏单元格。当用户在屏幕上移动手指时,更新快照的中心以便以编程方式移动它,使其看起来像用户正在拖动单元格。

  3. 诀窍是决定何时以及如何交换细胞。当快照移动时,它将与其他单元格相交。当它发生时,你应该更新你的数据源并调用moveItemAtIndexPath,这样它就会交换原始单元格和快照相交的单元格的位置。

  4. 拖动结束时,从集合视图中删除快照并显示原始单元格。

  5. 您可以将这些步骤映射到手势识别器的状态,以便我们知道您应该在每个州做什么:

    • 开始:1
    • 已更改:2,3
    • 结束已取消失败:4

    我在我的github帐户中添加了example project,因此您可以下载并使用它。在这里,我将实现手势回调:

    注意:以下代码可能无效,因为我丢弃了一些特定于实现的细节。但它应该表明基本意图。请从我的github repo下载完整的代码。

    func longPressRecognized(recognizer: UILongPressGestureRecognizer) {
      let location = recognizer.locationInView(collectionView)
      let indexPath = collectionView.indexPathForItemAtPoint(location)
    
      switch recognizer.state {
        case .Began:
          let cell = collectionView.cellForRowAtIndexPath(indexPath)
          let snapshotView = cell.snapshotViewAfterScreenUpdates(true)
          snapshot.center = cell.center
          collectionView.addSubview(snapshotView)
          cell.contentView.alpha = 0.0 // hides original cell
    
        case .Changed:
          snapshotView.center = location // will follow user's finger.      
          dataSource.swap(originalCellIndexPath.item, indexPath.item) // swaps data
          collectionView.moveItemAtIndexPath(originalCellIndexPath, toIndexPath: indexPath) // swaps cells
          originalCellIndexPath = indexPath
    
        default:
          let cell = cellForRowAtIndexPath(originalCellIndexPath)
          cell.contentView.alpha = 1.0
          snapshotView.removeFromSuperview()
      }
    }
    

    以下是您将获得的效果(在iOS 8.4模拟器上录制)

    enter image description here