如何修复UICollectionView使用setContentOffset时的动画异常问题
问题原因分析
这两种动画方式的核心差异在于UICollectionView自身布局系统是否参与动画流程:
- 用
collectionView.setContentOffset(point, animated: true)时,UICollectionView会触发内部的布局动画逻辑,同步更新每个cell的frame,让第一个cell随着contentOffset的变化平滑向左移出屏幕,整个过程cell的显示状态是连续变化的,所以动画表现正常。 - 而用
UIView.animate包裹setContentOffset(animated: false)时,本质只是对contentOffset属性做插值动画,但UICollectionView的布局系统并没有被纳入动画流程。在动画执行过程中,collectionView会实时检查cell是否在可视区域内:一旦第一个cell的位置因contentOffset变化超出屏幕,就会立刻将其从可视层级移除(或放入复用池),而非通过frame渐变动画让它慢慢移出,所以视觉上呈现“直接消失”;第二个cell则是在contentOffset移动到其可视位置时才被创建/复用,因此会从右侧移入屏幕。
解决方法
如果想自定义动画速度同时保留正常的cell移出效果,可以用CATransaction修改系统动画时长,既利用collectionView自身的布局动画,又能控制速度:
let point = CGPoint(x: screenWidth, y: 0) CATransaction.begin() CATransaction.setAnimationDuration(0.2) collectionView.setContentOffset(point, animated: true) CATransaction.commit()
内容的提问来源于stack exchange,提问作者Carlo-Rodriguez
相关产品推荐
相关产品推荐

