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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 11:21:01