静态UITableViewCell的自动高度调整不起作用

时间:2019-10-16 17:13:37

标签: swift uitableview

我有一个静态的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 
}

这是我目前得到的结果:

enter image description here

我也将标签的行更改为0,并且单元格内标签的约束为0、12、0、12(顶部,右侧,底部,左侧)。

有人知道,为什么第3节中的单元格没有以正确的方式显示数据?

编辑: (执行上述建议后的外观如何

enter image description here

3 个答案:

答案 0 :(得分:0)

第3部分中的单元格正以正确的方式显示数据。除非另行说明,否则UILabel不会自动调整以适应其中的文本。

我需要做的是选择有问题的UILabel,然后在属性检查器中将Number of Lines设置为0enter image description here

您还说过,此UILabel是动态的,这意味着您将其文本设置为代码中的某个位置。设置此UILabel的文本后,您将立即要呼叫myLabel.sizeToFit()。这应该调整标签的高度以容纳其中的文本。

如果这行不通,我还有另一个更复杂的解决方案应该对您有用。

答案 1 :(得分:0)

由于sizeToFit()对您不起作用,因此我们将尝试一些更复杂的事情。

第3部分中的单元格正以正确的方式显示数据。这是因为UILabel不会自动调整其高度以容纳其中的文本。这是您需要做的:

1。为UILabel创建高度约束。在界面构建器中,为第3部分的单元格中UILabel的高度添加约束。通过@IBOutlet将此高度约束连接到视图控制器的类:

class YourViewController: UIViewController {

    @IBOutlet var cellLabel: UILabel!
    @IBOutlet var cellLabelHeight: NSLayoutConstraint!

    ...

}

2。添加用于计算高度的字符串扩展名。我不确定在何处/何时设置有问题的UILabel的文本,但是我知道您正在某处进行此操作,因为您将其描述为“动态的” 。每当您确实设置有问题的UILabel的文本时,现在还需要更改为适应该文本而设置的高度约束的常数。因此,我们需要能够根据UILabel的宽度和字体来计算其高度。我们可以在extension上添加String来完成此操作:

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)

答案 2 :(得分:0)

请看下面;

  • 选择您的cellLabel并将Lines值设置为0:

苹果也说Self-Sizing

摘要: 在单元格的内容视图中布置表格视图单元格的内容。要定义单元格的高度,您需要不间断的约束和视图链(具有定义的高度),以填充内容视图的顶部边缘与其底部边缘之间的区域。如果您的视图具有固有的内容高度,则系统将使用这些值。如果不是,则必须将适当的高度限制添加到视图或内容视图本身。 将AuthorLabel的底部约束从等于或大于或等于