Xcode 8 Swift 3自定义UITableViewCell:标签高度无法自适应问题求助
解决UITableViewCell中UILabel自适应高度问题
我来帮你搞定这个Label高度不能自适应的问题,这在自定义带自动布局的UITableViewCell里是个很常见的小坑,咱们一步步调整就能解决:
1. 确保Label的自动布局约束正确
首先要检查你的FruitTableViewCell里,labelQuestion的约束设置是否合理:
- 绝对不能给
labelQuestion设置固定高度约束,否则它会被限制死高度,无法根据内容撑开 - 要配置完整的约束链:比如
top约束到cell的contentView顶部,leading和trailing约束到contentView的左右边距,bottom约束到labelAnswer的顶部(或者contentView的底部,根据你的布局需求),这样自动布局才能明确Label的高度由内容决定
2. 开启Label的多行显示
你已经设置了lineBreakMode = .byWordWrapping,但还需要把Label的行数设置为0,这样它才能自动适配多行内容。在你的cellForRowAt方法里添加这行:
cell.labelQuestion.numberOfLines = 0
(默认UILabel的numberOfLines是1,只会显示一行,必须改成0才能支持多行)
3. 配置TableView的自动行高
在ViewController的viewDidLoad方法里,添加两行代码让TableView自动计算行高:
tableView.rowHeight = UITableViewAutomaticDimension tableView.estimatedRowHeight = 100 // 这里填一个你Cell的大概高度值,方便TableView做预估
这两行是核心,告诉TableView不要用固定行高,而是根据Cell内部的自动布局约束来计算每个Cell的实际高度。
4. 移除手动的sizeToFit调用
你代码里的cell.labelQuestion.sizeToFit()和cell.labelAnswer.sizeToFit()会干扰自动布局的计算逻辑——自动布局会自己处理Label的尺寸,手动调用这个方法会破坏约束关系,所以把这两行删掉。
修改后的完整cellForRowAt代码:
public override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell{ let cell = self.tableView.dequeueReusableCell(withIdentifier: "Feedcell", for: indexPath) as! FruitTableViewCell //获取对应位置的数据 let hero = heroes[indexPath.row] cell.labelAnswer.text = hero.answer cell.labelQuestion.numberOfLines = 0 // 新增:允许多行显示 cell.labelQuestion.lineBreakMode = .byWordWrapping cell.labelQuestion.text = hero.question // 移除了干扰自动布局的sizeToFit调用 return cell }
做完这些调整后,你的labelQuestion就能根据内容自动调整高度,对应的Cell也会跟着自适应高度了。
内容的提问来源于stack exchange,提问作者Scripy
相关产品推荐
相关产品推荐

