我尝试从一个集合视图拖动到另一个集合视图,它工作正常,除了当我长按一个项目并停在那里时。 该项目将成为它的拖动预览版本,并且不会回退到正常状态。如何停止活动拖动?
仅调用该方法:
(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()