我有一个静态UITableView
,我想动态设置三个单元格的行高。因此,在 viewDidLoad()
中,我实现了以下代码:
tableView.estimatedRowHeight = 100
tableView.rowHeight = UITableView.automaticDimension
我还实现了 heightForRowAt
方法:
(第一部分的前两个单元格应具有固定高度)
override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
if indexPath.section == 0 && indexPath.row == 0 {
return CGFloat(85)
} else if indexPath.section == 0 && indexPath.row == 1 {
return CGFloat(145)
}
return UITableView.automaticDimension
}
这是我目前得到的结果:
我也将标签的行数更改为 0,单元格内标签的约束为 0、12、0、12(上、右、下、左)。
有人知道为什么第 3 部分中的单元格不能以正确的方式显示数据吗?
编辑: (上述建议实现后的效果如何)
最佳答案
因为 sizeToFit()
不适合您,我们将尝试一些更复杂的方法。
第 3 部分中的单元格以正确的方式显示数据。这是因为 UILabel
不会自动调整其高度以容纳内部文本。您需要执行以下操作:
<强>1。为 UILabel 创建高度约束 在界面生成器中,为第 3 部分的单元格中的 UILabel
添加高度约束。通过 @IBOutlet 将此高度约束连接到 View Controller 的类:
class YourViewController: UIViewController {
@IBOutlet var cellLabel: UILabel!
@IBOutlet var cellLabelHeight: NSLayoutConstraint!
...
}
<强>2。添加计算高度的字符串扩展 我不确定您在何处/何时设置相关 UILabel
的文本,但我知道您正在某处执行此操作,正如您所描述的那样“动态的”。每当您设置相关 UILabel
的文本时,您现在还需要更改我们为适应该文本而创建的高度约束常量。因此,我们需要能够根据 UILabel 的宽度和字体计算它的高度。我们可以向 String
添加一个 extension
来执行此操作:
extension String {
func height(withConstrainedWidth width: CGFloat, font: UIFont) -> CGFloat {
let constraintRect = CGSize(width: width, height: .greatestFiniteMagnitude)
let boundingBox = self.boundingRect(with: constraintRect, options: .usesLineFragmentOrigin, attributes: [.font: font], context: nil)
return ceil(boundingBox.height)
}
}
<强>3。根据 UILabel 的文本设置高度约束常量最后一步是设置我们使用刚刚创建的扩展创建的 UILabel
高度约束的高度:
cellLabel.text = "DummyDataDummyDataDummyDataDummyDataDummyDataDummyDataDummyDataDummyData"
//This will be called immediately after you set the text for the UILabel in question
cellLabelHeight.constant = cellLabel.text.height(withConstrainedWidth: cellLabel.frame.width, font: cellLabel.font)
关于swift - 静态 UITableViewCell 的自动高度调整不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58418534/