UITableView使用UIView.Animation平滑滚动时cell提前消失问题咨询
问题根源
你当前的写法存在核心逻辑错误:UIView 动画块中修改属性时,属性的实际值(model layer)会立刻变更为最终值,系统仅在展示层(presentation layer)做过渡动画。而 UITableView 判断 cell 是否需要展示,读取的是 contentOffset 的实际值,所以动画刚开始就已经认为自己滚动到了 currentPoint 位置,自然会提前回收还在屏幕上的中间态 cell。
解决方案
直接使用 UITableView 自带的滚动方法配合 UIView 动画控制时长即可,系统会自动处理滚动过程中的 cell 可见性判定:
UIView.animate(withDuration: TimeInterval(remainder), delay: 0.0, options: .allowUserInteraction, animations: { // animated 设为 true,由外层 UIView 动画控制实际动画时长 self.tableView.setContentOffset(self.currentPoint, animated: true) }, completion: { _ in // 滚动完成后的业务逻辑 })
如果需要更精细的滚动过程控制(比如中途可动态调整速度、中断滚动),可以改用 CADisplayLink 逐帧更新 contentOffset,保证每一步的 contentOffset 实际值和当前展示的滚动位置一致,UITableView 就会正确渲染对应的 cell。
补充说明
- 多档位速度直接调整动画
duration即可实现:滚动距离固定的前提下,duration越小滚动速度越快 - 不需要额外调用
layoutIfNeeded,上述方案已经可以规避 cell 提前消失的问题
内容的提问来源于stack exchange,提问作者erdemgc
相关产品推荐
相关产品推荐

