UITableView自动布局问题:动态高度单元格实现异常求助
解决UITableView动态高度单元格的自动布局问题
我来帮你搞定这个动态高度的坑!你现在的写法里有几个关键误区,导致自动布局冲突,咱们一步步把它改对:
第一步:先把单元格的约束做完整
不管你是用Storyboard/XIB还是纯代码写cell,必须给label1和label2搭好垂直方向的完整约束链,这是系统能自动计算cell高度的基础:
- 给
label1加:顶部、左侧、右侧和contentView的间距约束(比如各留16pt) - 给
label2加:顶部和label1的底部间距(比如8pt)、左侧、右侧和contentView的间距约束,以及底部和contentView的间距约束 - 把两个label的
numberOfLines设为0(可以直接在XIB/Storyboard里勾选,或者在cell的初始化方法里写一次就行,不用每次复用都重复设置)
第二步:给TableView开启自动高度计算
在你的ViewController的viewDidLoad里加上这两行,告诉TableView不要用固定行高,而是靠约束自动算:
override func viewDidLoad() { super.viewDidLoad() // 其他初始化代码... tableView.rowHeight = UITableView.automaticDimension tableView.estimatedRowHeight = 120 // 这里给个接近你内容平均高度的数值,帮系统优化滚动体验 }
第三步:简化你的cellForRowAt方法
删掉手动干预布局的代码,只保留核心的文本赋值就行,约束和TableView的配置已经能搞定高度了:
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "QuestionsCell", for: indexPath) as! QuestionsCell // 直接赋值就行,复用的时候新文本会覆盖旧内容,不用先清空 cell.label1.text = yourDataArray[indexPath.row].text1 cell.label2.text = yourDataArray[indexPath.row].text2 return cell }
为啥你的原有写法会出问题?
你手动调用sizeToFit()会强制label自己调整尺寸,这和Auto Layout的约束驱动逻辑完全冲突——系统本来应该靠约束算出label大小,再推导出cell高度,你手动干预后就会触发约束警告,导致布局错乱。另外重复设置label.text = ""也是没必要的操作,纯纯的多余步骤。
内容的提问来源于stack exchange,提问作者Scripy
相关产品推荐
相关产品推荐

