自动增长静态表格视图单元格高度以适合标签内容高度

时间:2017-05-18 18:48:56

标签: swift uitableview

这是我的单元格布局的低质量模型:

mockup

静态单元格的初始高度(在故事板中设置)为80.在此单元格内部有两个视图。底部视图的固定高度为40.顶视图的布局约束与顶部边距对齐,并垂直对齐底部视图。

顶视图内部是标签(蓝色)和按钮(黄色)

标签还具有与视图顶部对齐并与视图底部对齐的约束。布局和约束背后的想法是,如果我将单元格的高度增加到100,例如,底部视图高度保持为40,顶部视图和标签高度将扩展到60的高度。

我的标签包含换行自动换行,行数设置为0.我现在想要的是自动调整单元格的大小,以便在有多行时显示标签的完整内容。我怎么能这样做?

我试过了:

self.tableView.rowHeight = UITableViewAutomaticDimension;
self.tableView.estimatedRowHeight = 80.0;

这不起作用。单元格高度始终与UILabel中的行数保持独立。

我也尝试过:

override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    return UITableViewAutomaticDimension;
}

与我的第一种方法结果相同。

我尝试的更复杂的方法如下:

override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    let heightLabel = self.heightForView(text: self.lblTitle.text!, font: UIFont(name: "Helvetica Neue", size: 18)!, width: self.lblTime.width);
    let heightView = (heightLabel + (80.0 / 2));

    print("title label height \(heightLabel)");
    print("title view height \(heightView)");

    if (heightView > 80.0) {
        return heightView;
    }

    return 80.0;
}

func heightForView(text: String, font: UIFont, width: CGFloat) -> CGFloat {
    let label: UILabel = UILabel(frame: CGRect(x: 0, y: 0, width: width, height: CGFloat.greatestFiniteMagnitude));
    label.numberOfLines = 0;
    label.lineBreakMode = .byWordWrapping;
    label.font = font;
    label.text = text;
    label.sizeToFit();

    return label.frame.height;
}

输出:

title label height 42.5
title view height 82.5

但这似乎也不起作用,因为其他行没有显示,只有标签的第一行。

我怎样才能使这个工作?

修改

我想当我知道标签的宽度时,计算标签高度的方法会起作用。但我怎么知道呢?

1 个答案:

答案 0 :(得分:6)

从个人经验来看,让UITableCells正确成长是iOS中最烦人的事情之一。最大的问题通常是限制。如果它们不完美,那么细胞就不会成长。

关键是能够从单元格内容视图的顶部到内容视图的底部绘制一条直线。因此,从您的示例常量看起来应该如下所示。

topView.top == contentView.top
label.top == topView.top
label.bottom == topView.bottom
topView.bottom == bottomView.top
bottomView.height == 40
bottomView.bottom == contentView.bottom

如果没有这条直线,布局就无法确定标签显示所有内容的正确高度。

所以你在新的示例项目中寻找的是一个相当简单的版本:

class ViewController: UITableViewController {
    @IBOutlet weak var label: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()

        self.tableView.rowHeight = UITableViewAutomaticDimension
        self.tableView.estimatedRowHeight = 80.0

        label.text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
    }

    override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        return UITableViewAutomaticDimension
    }
}

使用相同的布局: Layout of Table Cell

结果显示在模拟器中。 Result Image