iOS 15中tableView调用beginUpdates后heightForRowAt未调用如何解决
问题背景
iOS 15之前,调用如下代码即可触发heightForRowAt回调,无需重载cell内容就能更新cell高度:
self.tableView.beginUpdates() self.tableView.endUpdates()
iOS 15对UITableView的高度计算逻辑做了优化,当系统判定没有数据源变更时,上述代码不会触发高度重计算回调,原有方案失效。
不重载cell数据前提下刷新高度的解决方案
方案1:使用performBatchUpdates(最优,兼容iOS 11+)
这是苹果官方推荐的批量更新替代方案,传入空的变更块即可触发全量高度重计算,完全不会修改cell内的现有内容:
// Swift 代码 self.tableView.performBatchUpdates(nil, completion: nil)
// Objective-C 代码 [self.tableView performBatchUpdates:nil completion:nil];
方案2:局部刷新指定行(仅需更新部分行高度时使用)
如果只需要调整少量cell的高度,调用reloadRows时指定.none动画,系统只会重计算高度,不会触发cell内容复用重置:
// Swift 代码,刷新指定indexPath对应的行 self.tableView.reloadRows(at: [targetIndexPath], with: .none)
注意:此方案仅适合cell复用逻辑稳定的场景,优先选择方案1
方案3:全版本兼容兜底方案
如果需要同时兼容iOS 11以下的系统版本,可以搭配原有逻辑做版本判断:
if #available(iOS 11.0, *) { self.tableView.performBatchUpdates(nil, completion: nil) } else { self.tableView.beginUpdates() self.tableView.endUpdates() }
内容的提问来源于stack exchange,提问作者Viktoria
相关产品推荐
相关产品推荐

