在显示 UIContextMenu 时从 UICollectionView 中删除项目时出现奇怪的动画
Weird animation when deleting item from UICollectionView while UIContextMenu is shown
我正在使用 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])
})
}
一切正常,但是当我点击 "Delete" 项目时,会出现一个奇怪的动画,即已删除的项目留在原处而其他项目正在移动,然后它立即消失。有时我什至会在新项目出现前的几分之一秒内看到空的 space 或随机项目。
如果我在未显示上下文菜单时调用 collectionView.deleteItems()
,删除动画会按预期工作。
看起来怪异的动画是两个几乎同时 运行 的动画发生冲突的结果:
- 删除动画:当"Delete"项被点击时,调用
collectionView.deleteItems()
并删除指定的collection项并带有动画。
- 菜单关闭动画:点击菜单项后,上下文菜单也会关闭,并显示另一个显示已删除项目几分之一秒的动画。
这看起来像是一个应该由 Apple 修复的错误。但作为一种解决方法,我不得不延迟删除,直到关闭动画完成:
func deleteItem(at indexPath: IndexPath) {
let delay = 0.4 // Seconds
DispatchQueue.main.asyncAfter(deadline: .now() + delay) {
self.collectionView.performBatchUpdates({
self.items.remove(at: indexPath.item)
self.collectionView.deleteItems(at: [indexPath])
})
}
}
0.4
秒是对我有用的最短延迟。
我正在使用 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])
})
}
一切正常,但是当我点击 "Delete" 项目时,会出现一个奇怪的动画,即已删除的项目留在原处而其他项目正在移动,然后它立即消失。有时我什至会在新项目出现前的几分之一秒内看到空的 space 或随机项目。
如果我在未显示上下文菜单时调用 collectionView.deleteItems()
,删除动画会按预期工作。
看起来怪异的动画是两个几乎同时 运行 的动画发生冲突的结果:
- 删除动画:当"Delete"项被点击时,调用
collectionView.deleteItems()
并删除指定的collection项并带有动画。 - 菜单关闭动画:点击菜单项后,上下文菜单也会关闭,并显示另一个显示已删除项目几分之一秒的动画。
这看起来像是一个应该由 Apple 修复的错误。但作为一种解决方法,我不得不延迟删除,直到关闭动画完成:
func deleteItem(at indexPath: IndexPath) {
let delay = 0.4 // Seconds
DispatchQueue.main.asyncAfter(deadline: .now() + delay) {
self.collectionView.performBatchUpdates({
self.items.remove(at: indexPath.item)
self.collectionView.deleteItems(at: [indexPath])
})
}
}
0.4
秒是对我有用的最短延迟。