如何取消 UICollectionView 的拖动?



我尝试从一个集合视图拖动到另一个集合视图,它工作正常,除了当我长按一个项目并停在那里时。 该项目将成为它的拖动预览版本,并且不会回退到正常状态。如何停止活动拖动?

仅调用该方法:

(NSArray<UIDragItem *> *)collectionView:(UICollectionView *)collectionView itemsForBeginningDragSession:(id<UIDragSession>)session atIndexPath:(NSIndexPath *)indexPath

不调用拖放委托方法。 也不调用拖动结束方法

AFAIK,没有办法突然取消正在进行的拖动会话(如果这是您想要的(,我觉得在用户体验方面也会出错

但是,您可以通过以下方式返回取消建议:

func collectionView(_ collectionView: UICollectionView, dropSessionDidUpdate session: UIDropSession, withDestinationIndexPath destinationIndexPath: IndexPath?) -> UICollectionViewDropProposal

这是一个拖放委托方法(要求UICollectionView符合dropDelegate(,在整个拖动会话中被调用,直到项目被丢弃。

如果return UICollectionViewDropProposal(operation: .cancel)此方法,则拖动的单元格将以动画形式返回到指示取消的原点。这可能是你能做的最好的事情...

func collectionView(_ collectionView: UICollectionView, dropSessionDidUpdate session: UIDropSession, withDestinationIndexPath destinationIndexPath: IndexPath?) -> UICollectionViewDropProposal {
//Do your evaluation
//if (evaluation requires drop cancellation){
//    return UICollectionViewDropProposal(operation: .cancel)
//}
//else
return UICollectionViewDropProposal(operation: .move) //This is the usual behaviour
}

希望这有帮助,干杯!

您也可以通过cancelInteractiveMovement((方法取消拖动事件,此方法将取消拖动事件并重新排列旧状态,当您的应用程序进入后台或控制器正在更改状态时,此方法将取消所有交互式移动:

collectionView.cancelInteractiveMovement()

最新更新