为UICollectionView实现重新排序手势

时间:2017-05-11 14:25:42

标签: ios swift uicollectionview uigesturerecognizer

我正在iOS Xcode 8.3.2 Swift 3.1中创建一个屏幕,其上有一行水平滚动的UICollectionView,带有一行图像。问题是,我曾经认为“自​​动重新排序”功能是UICollectionView的一部分,当它实际上只在UICollectionViewController中实现时。因为我只想要滚动屏幕的一部分,我不相信我可以使用集合视图控制器 - 在这种情况下集合视图总是全屏,对吧?通过控制器,我发现了installsStandardGestureForInteractiveMovement,它自动实现了一个手势识别器。

我希望在我的集合视图中具有相同的功能,该视图位于UIViewController上。但是,我不知道我需要捕获哪些手势来实现细胞重新排序。是否有任何拖动重新排序“魔法”内置于集合视图本身?有没有办法可以使用控制器,而不是全屏收集视图?

我已经实现了以下方法来实际移动数据,但我不确定要设置哪个手势识别器。

func collectionView(_ collectionView: UICollectionView,
                        moveItemAt sourceIndexPath: IndexPath,
                        to destinationIndexPath: IndexPath) {

    let cellToMove = promoPages.remove(at: (sourceIndexPath as NSIndexPath).row)
    promoPages.insert(cellToMove, at: (destinationIndexPath as NSIndexPath).row)
}

1 个答案:

答案 0 :(得分:0)

阅读this guide后,将其转换为Swift3:

UIViewController课程:

override func viewDidLoad() {
    super.viewDidLoad()

    let g = UILongPressGestureRecognizer(target: self,
                                         action: #selector(handleLongGesture(_:)))
    clcImages?.addGestureRecognizer(g)
}

func handleLongGesture(_ gesture: UILongPressGestureRecognizer)
{
    switch(gesture.state) {
    case UIGestureRecognizerState.began:
        guard let selectedIndexPath = clcImages?.indexPathForItem(at: gesture.location(in: clcImages)) else {
            break
        }
        clcImages?.beginInteractiveMovementForItem(at: selectedIndexPath)
    case UIGestureRecognizerState.changed:
        clcImages?.updateInteractiveMovementTargetPosition(gesture.location(in: gesture.view!))
    case UIGestureRecognizerState.ended:
        clcImages?.endInteractiveMovement()
    default:
        clcImages?.cancelInteractiveMovement()
    }
}