You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何判断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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 08:46:13