显示UIContextMenu时从UICollectionView删除项目时出现怪异的动画

时间:2019-09-18 16:17:41

标签: ios swift uicollectionview uicontextmenuinteraction

我正在使用UIContextMenuInteraction来显示UICollectionView的上下文菜单,如下所示:

func collectiovnView(_ collectionView: UICollectionView, contextMenuConfigurationForItemAt indexPath: IndexPath, point: CGPoint) -> UIContextMenuConfiguration? {
    return UIContextMenuConfiguration(identifier: nil, previewProvider: nil, actionProvider: { _ in
        let deleteAction = UIAction(title: "Delete", image: UIImage(systemName: "trash"), attributes: .destructive) { _ in
            self.deleteItem(at: indexPath)
        }
        return UIMenu(title: "Actions", children: [deleteAction])
    })
}

func deleteItem(at indexPath: IndexPath) {
    self.collectionView.performBatchUpdates({
        self.items.remove(at: indexPath.item)
        self.collectionView.deleteItems(at: [indexPath])
    })
}

一切正常,但是当我点击“删除”项目时,出现奇怪的动画,其中删除的项目停留在其位置,而其他项目在移动,然后立即消失。有时我什至在新项目出现之前几秒钟就看到一个空白或随机项目。

如果在未显示上下文菜单的情况下呼叫collectionView.deleteItems(),则删除动画将按预期工作。

1 个答案:

答案 0 :(得分:1)

看起来奇怪的动画是两个动画之间发生冲突的结果:

  1. 删除动画:轻按“删除”项目时,将调用collectionView.deleteItems()并使用动画删除指定的收集项目。
  2. 菜单关闭动画:点击菜单项后,上下文菜单也与另一个动画一起关闭。

两个动画都影响相同的收藏品,并且它们几乎同时运行。

这看起来像应该由Apple修复的错误,但现在,作为一种解决方法,我们可以将第二个动画延迟到第一个动画完成为止。我们可以通过在呼叫collectionView.deleteItems()之前等待一些时间(对我来说是0.4秒有效)来实现:

func deleteItem(at indexPath: IndexPath) {
    DispatchQueue.main.asyncAfter(deadline: .now() + 0.4) {
        self.collectionView.performBatchUpdates({
            self.items.remove(at: indexPath.item)
            self.collectionView.deleteItems(at: [indexPath])
        })
    }
}