如何判断UICollectionView插入/删除动画已完成?(Swift)
如何判断UICollectionView插入/删除动画已完成(Swift)
这个问题我做项目时也碰到过,其实UICollectionView给我们提供了几种可靠的方式来监听插入/删除动画的完成时机,分两种常见场景来介绍:
1. 批量操作(使用performBatchUpdates)
如果你是通过performBatchUpdates(_:completion:)来执行批量的插入、删除、移动操作,那直接利用它的completion闭包就可以精准捕获动画完成的时机。这个闭包会在所有批量操作的动画都结束后被调用,还会返回一个finished参数,用来判断动画是否完整执行(没有被中断)。
示例代码:
collectionView.performBatchUpdates({ // 在这里执行你的插入/删除操作 collectionView.insertItems(at: [IndexPath(item: 0, section: 0)]) collectionView.deleteItems(at: [IndexPath(item: 2, section: 0)]) }) { isFinished in // 动画完成后执行你的更新操作 guard isFinished else { // 如果动画被中断(比如用户快速滚动),可以在这里做容错处理 return } print("所有插入/删除动画已完成,开始执行后续更新") self.doYourPostUpdateWork() // 替换成你的更新逻辑 }
2. 单个插入/删除操作
如果是单独调用insertItems(at:)或者deleteItems(at:)这类单个操作,这些方法本身没有提供completion回调。这时候可以借助**Core Animation事务(CATransaction)**来监听动画完成,因为UICollectionView的单元格动画本质上是基于Core Animation实现的。
示例代码:
// 开启一个Core Animation事务 CATransaction.begin() // 设置事务完成后的回调 CATransaction.setCompletionBlock { print("单个插入/删除动画已完成") self.doYourPostUpdateWork() // 执行你的更新操作 } // 执行单个插入或删除操作 collectionView.insertItems(at: [IndexPath(item: 1, section: 0)]) // 或者 collectionView.deleteItems(at: [IndexPath(item: 3, section: 0)]) // 提交事务 CATransaction.commit()
注意事项
performBatchUpdates的finished参数很重要:如果动画因为用户交互(比如快速滑动CollectionView)被系统中断,这个参数会返回false,你可以根据业务需求决定是否在这种情况下执行后续更新。- CATransaction的completionBlock会监听当前事务内所有动画的完成,所以如果在同一个事务里执行多个操作,也能正确捕获整体完成时机。
内容的提问来源于stack exchange,提问作者Phantom59
相关产品推荐
相关产品推荐

