我正在iOS Xcode 8.3.2swift 3.1中创建一个屏幕,上面有一个水平滚动的UICollectionView,上面有一行图像。问题是,我曾认为“自动重新排序”功能是UICollectionView的一部分,而实际上它只在UICollectionViewController中实现。因为我只想滚动屏幕的一部分,所以我不相信我可以使用collection view控制器——在这种情况下,collection view总是全屏的,对吧?通过控制器,我发现了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)
}

最佳答案

读取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()
    }
}

关于ios - 为UICollectionView实现重新排序手势,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43918244/

10-12 00:15
查看更多