为什么自定义 UITableViewCell 中的 UILabel 没有返回正确的高度?



我正在使用一个自定义的UITableViewCell子类,其中包含一个名为descriptionLabel的自定义子类UILabel。我有一个名为nativeHeight的变量,它应该是单元格的高度,具体取决于标签中文本的长度。行 2+ 的单元格设置为高度 50,除非它们被选中,此时它们将扩展到UILabel可见的完整高度。但是,它不会返回适当的值来启用此功能。我将其定义如下(其中 116 是所有其他内容的固定高度,不包括 UILabel(:

var nativeHeight : CGFloat {
return self.descriptionLabel.intrinsicContentSize.height + 116
}

该变量在单元格代码中调用:

override func setSelected(_ selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
if selected {
self.cellHeightConstraint.constant = self.nativeHeight
} else if !selected {
self.cellHeightConstraint.constant = 50
}
}

它也在表视图代码中调用:

override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
switch indexPath.row {
case 0:
return 136
case 1:
return 50
default:
if selectedRow != nil && indexPath == selectedRow {
tableView.layoutIfNeeded()
let cell = self.tableView(tableView, cellForRowAt: indexPath) as! DynamicTableViewCell
cell.layoutIfNeeded()
return cell.nativeHeight
} else {
return 50
}
}
}

Rakesha 是正确的,你不需要 heightForRowAtIndexPath。如果您正确设置了它,则会为您计算所有内容。

正确设置前两个单元格的约束,这样就不需要对 136 和 50 进行硬编码。

关于您的第三个单元格,我可能会考虑在您的描述标签上设置高度限制,即 50。当您希望扩展单元格时,只需停用高度约束并更新单元格布局即可。

您需要将单元格的状态(展开或不展开(存储在某个位置,以便在上下滚动时可以正确启用/禁用高度约束。

最新更新