我有一个UICollectionViewController
,它使用交互式移动API来支持单元格的重新排序。当一个单元格被拖到不同的位置,然后回到它的原始位置时,它会捕捉/跳转到适当的位置。这仅发生在iOS 13上,而不会发生在iOS 11或iOS 12上。
我使用以下方法来处理集合视图单元格的长时间按压:
@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回归。有没有人有任何建议或解决方法来解决这个问题?
发布于 2020-01-07 15:56:19
因为CollectionViews内置了iOS11拖放功能,所以你不再需要这么做了。
发布于 2020-02-26 05:53:36
经过一番折腾之后,我决定继续实现我自己的集合视图移动API,它反映了beginInteractiveMovementForItem
、updateInteractiveMovementTargetPosition
和endInteractiveMovement
方法。
这个SO answer很有帮助地说明了你必须重新实现的那种内部逻辑,如果合适的话,你还需要在拖拽和占位符单元格上实现滚动。特别是,您将创建被拖动单元格的快照(临时隐藏原始单元格),并在拖动时更新临时快照单元格的位置/样式。
这是苹果已经做了很多工作,所以如果你不是绝对需要控制拖拽或交换行为,绝对推荐使用iOS 11拖拽API(@trapper提到)。
我发现其他人似乎已经就此行为提交了radar,所以希望苹果公司能注意到这一点,并在未来的某个时候修复!
https://stackoverflow.com/questions/59624124
复制相似问题