如何使tableview行高取决于其内容

时间:2016-01-14 11:25:01

标签: ios swift tableview row-height uitableviewautomaticdimension

我以编程方式制作 tableView

tableView = UITableView.init(frame: CGRectZero, style: .Plain)
tableView.delegate = self
tableView.dataSource = self
self.view = tableView

然后我将 rowHeight 值设置为

tableView.estimatedRowHeight = 250
tableView.rowHeight = UITableViewAutomaticDimension

每个单元格在单独的 .swift 文件中描述,并且每个单元格都具有功能' construct()'它构建了自己的内容(标签,按钮等),这是他们的代码片段

let btnControl = UIButton()
btnControl.frame = CGRectMake(avatar.frame.origin.x, avatar.frame.origin.y + avatar.frame.size.height + 10, screenWidth - 20, 30)
self.addSubview(btnControl)

最后它看起来像

那么问题是什么?

2 个答案:

答案 0 :(得分:0)

如果您需要以编程方式创建约束,您将在文档页面中看到所需的一切:https://developer.apple.com/library/ios/documentation/AppKit/Reference/NSLayoutConstraint_Class/index.html

我知道做你正在寻找的唯一另一种方法是在你的" tableView(_:heightForRowAtIndexPath:)"中获取每个单元格的大小。 UITableViewDelegate协议的实现。

答案 1 :(得分:0)

为了使UITableviewCell按照内容动态化,您必须使其内容视图的子视图动态化。在您的情况下,您必须使所有使用的UILabel动态。这是代码。

CGSize maximumLabelSize = CGSizeMake(your label width, FLT_MAX);
sizeWithFont:yourLabel.font constrainedToSize:maximumLabelSize
lineBreakMode:yourLabel.lineBreakMode];

//adjust the label the the new height.
CGRect newFrame = yourLabel.frame;
newFrame.size.height = expectedLabelSize.height;
yourLabel.frame = newFrame;

现在依赖于一个UILable高度,您必须管理所有UILabel y和height如果您已经完成了单元格内容视图的最后一个子视图。计算最后一个子视图的高度+最后一个子视图的origin.y将是UITableview单元格的高度。

因此,请在heightForRowAtIndexPath委托方法中传递此高度。

(CGFloat)tableView:(UITableView *)tableView 
heightForRowAtIndexPath:(NSIndexPath *)indexPath;