【问题标题】:How to cancel a drag for UICollectionView?如何取消 UICollectionView 的拖动?
【发布时间】:2019-08-28 01:23:26
【问题描述】:

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

只有方法被调用:

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

不调用任何删除委托方法。也不调用拖拽结束方法

【问题讨论】:

    标签: ios drag


    【解决方案1】:

    AFAIK,没有办法突然取消正在进行的拖动会话(如果这是你想要的),我觉得这在 UX 方面也是错误的

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

    func collectionView(_ collectionView: UICollectionView, dropSessionDidUpdate session: UIDropSession, withDestinationIndexPath destinationIndexPath: IndexPath?) -&gt; 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
    }
    

    希望这会有所帮助,干杯!

    【讨论】:

      【解决方案2】:

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

      collectionView.cancelInteractiveMovement()
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-07-06
        • 2016-11-20
        • 2018-09-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-05
        相关资源
        最近更新 更多