【发布时间】:2017-10-18 17:40:42
【问题描述】:
这是我的单元格布局的低质量模型:
静态单元格(在情节提要中设置)的初始高度为 80。在此单元格内有两个视图。底部视图的固定高度为 40。顶部视图具有布局约束,以与上边距对齐并与底部视图垂直对齐。
顶视图内部是一个标签(蓝色)和一个按钮(黄色)
标签还具有与视图顶部对齐和与视图底部对齐的约束。该布局和约束背后的想法是,如果我将单元格的高度增加到 100,例如,底部视图高度保持 40,而顶部视图和标签高度将扩展到 60 高度。
我的标签有换行和行数设置为 0。我现在想要的是自动调整单元格的大小,以便在多行时显示标签的完整内容。我该怎么做?
我试过了:
self.tableView.rowHeight = UITableViewAutomaticDimension;
self.tableView.estimatedRowHeight = 80.0;
这不起作用。单元格高度始终保持为 80,与 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
但这似乎也不起作用,因为其他行没有显示,只有标签的第一行。
我怎样才能让它工作?
编辑
我想当我知道标签的宽度时,计算标签高度的方法会起作用。但是我怎么知道呢?
【问题讨论】:
-
而不是
self.tableView.estimatedRowHeight = 80.0;将estimatedRowHeight设置为120.0;。estimatedRowHeight将不允许tableView行超过80,如果你设置80。如果你需要它扩展超过80,你必须设置它为120。更多developer.apple.com/reference/uikit/uitableview/… -
如果它应该大于 120?高度可以是动态的每个高度(取决于标签的行数)。
-
我刚刚给了你一个大概的高度。您必须根据您显示的消息设置最大值。
-
所以这是一种绝对行不通的方法,因为我有多个标签,它们都可以有不同的高度。
-
我觉得你很困惑。您不需要计算每行的高度。如果你设置
estimatedRowHeight。关注此raywenderlich.com/129059/self-sizing-table-view-cells
标签: swift uitableview