在 iOS 13 上拖动时,UICollectionView 单元格会捕捉到原始位置



我有一个使用交互式移动API来支持单元格重新排序的UICollectionViewController。当单元格被拖动到其他位置,然后返回到其原始位置时,它会捕捉/跳跃到位。这仅在 iOS 13 上发生,在 iOS 11 或 iOS 12 上不会发生。

https://i.stack.imgur.com/9xRrN.jpg

我使用以下方法处理长按集合视图单元格:

@objc private func handleLongPress(_ recognizer: UILongPressGestureRecognizer) {
switch recognizer.state {
case .began:
guard let selectedIndexPath = collectionView.indexPathForItem(at: recognizer.location(in: collectionView)) else {
break
}
collectionView.beginInteractiveMovementForItem(at: selectedIndexPath)
case .changed:
collectionView.updateInteractiveMovementTargetPosition(recognizer.location(in: collectionView))
case .ended:
collectionView.endInteractiveMovement()
default:
collectionView.cancelInteractiveMovement()
}
}

此处提供了一个最小的可重现示例:https://github.com/wsun/ios13DragDrop

我想坚持使用交互式移动 API,而不是使用较新的 iOS 11 拖放 API,因为它可以控制用户可以将单元格拖动到的位置。由于我没有做任何特别新颖的事情,我怀疑这可能是 iOS 13 中的 UIKit 回归。有没有人有任何建议或解决方法来解决这个问题?

由于iOS11拖放内置于CollectionViews中,因此您不再需要这样做。

https://developer.apple.com/documentation/uikit/views_and_controls/collection_views/supporting_drag_and_drop_in_collection_views

经过一番摆弄,我决定继续实现我自己的集合视图运动 API,它反映了beginInteractiveMovementForItemupdateInteractiveMovementTargetPositionendInteractiveMovement的方法。

这个 SO 答案有助于说明您必须重新实现的内部逻辑类型,如果合适,您还需要在拖动和占位符单元格上实现滚动。特别是,您将创建拖动单元格的快照(暂时隐藏原始单元格(,并在拖动临时快照单元格时更新其位置/样式。

这是苹果已经处理过的一堆工作,所以如果你不是绝对需要控制拖动或交换行为,绝对建议使用 iOS 11 拖动 API(@trapper 提到(。

我发现其他人似乎已经对这种行为提出了雷达,所以希望苹果在未来的某个时候注意到并修复!

最新更新