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

滚动状态下重新加载表格行导致表格出现“跳动”问题

解决UITableView滚动时刷新行的跳动问题

我之前也碰到过这个烦人的表格跳动问题!尤其是表格处于滚动状态时,明明用了.none动画刷新指定行,还是会出现莫名的跳动,其实这是UITableView滚动状态下布局逻辑的小坑,给你几个实用的解决思路:


1. 直接更新Cell内容(最推荐)

调用reloadRows会触发Cell的复用与重新布局,滚动时这种操作很容易引发位置偏移。如果目标Cell当前可见,直接获取Cell实例并更新内容是最轻量化的方案,完全不会有跳动:

// 假设你的自定义Cell类是CustomFormCell
if let targetCell1 = formFieldsTable.cellForRow(at: indexPath) as? CustomFormCell {
    targetCell1.updateUI(with: newDataForRow1) // 自定义方法更新内容
}
if let targetCell2 = formFieldsTable.cellForRow(at: indexPath2) as? CustomFormCell {
    targetCell2.updateUI(with: newDataForRow2)
}

2. 临时禁用行高估算(针对自动行高场景)

如果你的表格用了UITableView.automaticDimension自动计算行高,滚动时刷新行可能触发行高重新计算,导致表格跳动。可以在刷新前后临时控制行高估算:

// 刷新前临时关闭行高估算,用固定值或已缓存的行高
let originalEstimatedHeight = formFieldsTable.estimatedRowHeight
formFieldsTable.estimatedRowHeight = 0
formFieldsTable.rowHeight = yourCachedRowHeight // 如果有缓存的固定行高更稳妥

// 执行刷新
formFieldsTable.reloadRows(at: [indexPath, indexPath2], with: .none)

// 刷新后恢复原设置
formFieldsTable.estimatedRowHeight = originalEstimatedHeight
formFieldsTable.rowHeight = UITableView.automaticDimension

3. 强制锁定滚动位置

刷新前手动固定表格的滚动偏移,避免刷新时的位置跳动:

// 记录当前滚动位置并强制无动画保持
let currentOffset = formFieldsTable.contentOffset
formFieldsTable.setContentOffset(currentOffset, animated: false)

// 执行刷新
formFieldsTable.reloadRows(at: [indexPath, indexPath2], with: .none)

优先试试第一种直接更新Cell的方式,既高效又能从根源上避免布局波动;如果业务逻辑必须用reloadRows,再结合后两种方法优化。

内容的提问来源于stack exchange,提问作者Return-1

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:37:38