如何通过约束根据内部UIImageView固有尺寸自动更新UITableViewCell高度
解决方案
问题根源
UIImageView替换图片后会自动更新自身的intrinsicContentSize,也会触发所在cell的内部布局更新,但UITableView的自动行高会缓存初始计算的行高值,默认不会因为cell内部子视图的尺寸变化主动触发全局行高重算,仅调用cell层级的setNeedsLayout/layoutIfNeeded无法通知tableView更新行高。
修复方法
在替换图片后调用UITableView的performBatchUpdates方法即可,该方法仅触发tableView重新计算现有cell的行高,不会触发cell的重用、重绘,也不会执行任何cell reload逻辑,完全符合需求。
你需要修改cellForRowAt中的延迟加载代码,增加弱引用避免循环引用,同时触发表格批更新:
DispatchQueue.main.asyncAfter(deadline: .now() + 1) { [weak self, weak cell] in guard let self = self, let cell = cell else { return } cell.imageView2.image = UIImage(named: "keyboard") // 仅触发行高重算,无任何多余操作 self.table.performBatchUpdates(nil) }
方案合规校验
完全符合你明确禁止的4类方案要求:
- 未实现
heightForRowAtIndexPath代理方法 - 未手动读取
intrinsicContentSize做任何尺寸计算 - 未调用任何cell/行重刷接口,不会触发无限重刷问题
- 未重写
layoutSubviews方法
内容的提问来源于stack exchange,提问作者Vladislav
相关产品推荐
相关产品推荐

