UITAbleViewCell 中具有动态高度的多个 UILabel
Multiple UILabels in UITAbleViewCell with dynamic height
在一个空的 UITableViewCell
中,我有两个 UILabel
像这样对齐:|--label1----label2--|。 两者 都将动态填充。我需要以两个标签保持居中对齐的方式设置约束,但 单元格的高度 由具有 最多内容 的标签确定.
到目前为止:
- 标签的行数设置为 0
在ViewDidLoad
中:
tableView.rowHeight = 40.0
tableView.estimatedRowHeight = 40.0
UITableViewDelegate
方法:
func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
return UITableViewAutomaticDimension
}
func tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
return UITableViewAutomaticDimension
}
问题是我找不到合适的约束设置来实现这样的结果:
|---------------- ----------一条长消息--|
|--一条长消息------一条长消息--|
|--一条长消息message------一条长消息--|
|--一条长消息------一条长消息--|
|--一条长消息- ------更长的消息--|
|----------------------------更长的消息--|
或
|------------------------更长的消息--|
|--消息----------更长的消息--|
|------------------------更长留言--|
有任何想法吗?我正在使用 Swift 1.2
、Xcode 6.3
(和 Storyboard
)
谢谢!
为单元格添加(较低优先级)固定高度约束(例如 = 40)。
为每个标签添加顶部和底部约束。使顶部约束为固定边距(例如 = 8)。使底部约束成为(更高优先级)大于或等于约束(例如 >= 8)。
单元格的高度将由较高的标签决定,所有其他垂直约束仍将得到满足。
更新:
事实证明,您不需要单元格的固定高度约束,甚至不需要调整水平内容拥抱或压缩阻力优先级。
我将标签的顶部和左侧或右侧边缘固定到 superview.margin, = 0,并在标签之间添加了水平 space >= 4.
我将标签的底部边缘固定到 superview.margin,>= 0。我还将两个标签的垂直压缩阻力优先级设置为 1000。
至此,我们已经设置了最低限度的必要约束。但是,如果两个标签都很长,一个标签将占据大部分宽度,迫使另一个标签变得非常窄。我任意地为两个标签添加了宽度 >= 100 的约束以平衡事情。
在 -viewDidLoad
中启用自动调整大小,然后分配标签文本,并让单元格自行布局。没有必要覆盖自定义 UITableViewCell
.
中的任何内容
self.tableView.rowHeight = UITableViewAutomaticDimension;
self.tableView.estimatedRowHeight = 44.0;
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
TableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];
cell.leftLabel.text = ...;
cell.rightLabel.text = ...;
[cell setNeedsLayout];
[cell layoutIfNeeded];
return cell;
}
在一个空的 UITableViewCell
中,我有两个 UILabel
像这样对齐:|--label1----label2--|。 两者 都将动态填充。我需要以两个标签保持居中对齐的方式设置约束,但 单元格的高度 由具有 最多内容 的标签确定.
到目前为止:
- 标签的行数设置为 0
在
ViewDidLoad
中:tableView.rowHeight = 40.0 tableView.estimatedRowHeight = 40.0
UITableViewDelegate
方法:func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { return UITableViewAutomaticDimension } func tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { return UITableViewAutomaticDimension }
问题是我找不到合适的约束设置来实现这样的结果:
|---------------- ----------一条长消息--|
|--一条长消息------一条长消息--|
|--一条长消息message------一条长消息--|
|--一条长消息------一条长消息--|
|--一条长消息- ------更长的消息--|
|----------------------------更长的消息--|
或
|------------------------更长的消息--|
|--消息----------更长的消息--|
|------------------------更长留言--|
有任何想法吗?我正在使用Swift 1.2
、Xcode 6.3
(和Storyboard
) 谢谢!
为单元格添加(较低优先级)固定高度约束(例如 = 40)。
为每个标签添加顶部和底部约束。使顶部约束为固定边距(例如 = 8)。使底部约束成为(更高优先级)大于或等于约束(例如 >= 8)。
单元格的高度将由较高的标签决定,所有其他垂直约束仍将得到满足。
更新:
事实证明,您不需要单元格的固定高度约束,甚至不需要调整水平内容拥抱或压缩阻力优先级。
我将标签的顶部和左侧或右侧边缘固定到 superview.margin, = 0,并在标签之间添加了水平 space >= 4.
我将标签的底部边缘固定到 superview.margin,>= 0。我还将两个标签的垂直压缩阻力优先级设置为 1000。
至此,我们已经设置了最低限度的必要约束。但是,如果两个标签都很长,一个标签将占据大部分宽度,迫使另一个标签变得非常窄。我任意地为两个标签添加了宽度 >= 100 的约束以平衡事情。
在 -viewDidLoad
中启用自动调整大小,然后分配标签文本,并让单元格自行布局。没有必要覆盖自定义 UITableViewCell
.
self.tableView.rowHeight = UITableViewAutomaticDimension;
self.tableView.estimatedRowHeight = 44.0;
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
TableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];
cell.leftLabel.text = ...;
cell.rightLabel.text = ...;
[cell setNeedsLayout];
[cell layoutIfNeeded];
return cell;
}