重新排序CollectionView单元格iOS 11

时间:2017-09-02 20:36:39

标签: ios objective-c swift ios11

我知道iOS 11为collectionview带来了新的拖放功能,但我有一个完全独立的问题。所以我想我会尝试使用IOS 9中引入的旧方法(see this link)。我的问题是,在iOS 11上,当手指被移除时,结束动画仅在切换两个单元格时才会出现奇怪现象。您可以在此clip中看到问题。

我一直试图弄清楚这几天,没有运气。它适用于iOS 10但不适用于iOS 11.任何帮助都将受到赞赏。

额外信息:我正在使用带有长按手势的集合视图来启动重新排序手势,如第一个链接中所示。但是,使用uicollectionviewcontroller时仍会出现问题

以下是长按手势的代码:

func handleLongGesture(gesture: UILongPressGestureRecognizer) {

    switch(gesture.state) {

    case .began:
        guard let selectedIndexPath = self.collectionView.indexPathForItem(at: gesture.location(in: self.collectionView)) else {
            break
        }
        collectionView.beginInteractiveMovementForItem(at: selectedIndexPath)
    case .changed:
        collectionView.updateInteractiveMovementTargetPosition(gesture.location(in: gesture.view!))
    case .ended:
      // this part misbehaves on ios 11 when two cells are swapped
        collectionView.performBatchUpdates({
            self.collectionView.endInteractiveMovement()
        )}
    default:
        collectionView.cancelInteractiveMovement()
    }
}

2 个答案:

答案 0 :(得分:1)

首先,您不需要将collectionView.endInteractiveMovement()放在performBatchUpdates块内。但是,这个问题对我来说也是一个烦恼。 iOS 10和11之间的差异以及endInteractiveMovement这个事情并没有多大意义。

对于我的问题,我在我的collectionView上面放置一个假快照单元格,并在我执行手势状态更改和updateInteractiveMovementTargetPosition时隐藏下面的内容。一旦手势状态为.ended,我 从超视图中移除假单元格,然后执行endInteractiveMovement。但是现在使用iOS 11,我在上一个答案的评论中遇到了与@prolfe相同的问题。由于这个无法预料的重新加载有问题的细胞,我得到了这种奇怪的闪光。

我最终采用的解决方案是延迟我的假细胞去除,以便它有点掩盖'闪光。

我的pushBackView方法将假单元格设置回放置位置,然后移除假单元格。然后我制定了延迟:

case .ended:

        fakeCellView?.pushBackView { [weak self] in // 'suppress' cell animation

            DispatchQueue.main.asyncAfter(deadline: .seconds(0.01), execute: {
                self?.fakeCellView?.removeFromSuperview()
            })

            self?.collectionView?.endInteractiveMovement()
        }

希望这有帮助!

enter image description here

答案 1 :(得分:0)

无需在performBatchUpdates块中执行self.collectionView.endInteractiveMovement()