具有动态高度的 UITableViewCell 中的多个 UILabel

Posted

技术标签:

【中文标题】具有动态高度的 UITableViewCell 中的多个 UILabel【英文标题】:Multiple UILabels in UITAbleViewCell with dynamic height 【发布时间】:2015-05-15 19:06:08 【问题描述】:

在一个空的UITableViewCell 中,我有两个UILabels 像这样对齐:|--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

问题是我找不到合适的约束设置来实现这样的结果:|------------------------ ----一条较长的消息--||--一条较长的消息-------一条较长的消息--||--一条较长的消息-------一条较长的消息消息--||--一条长消息-----一条更长的消息--||--一条长消息--------一条更长的消息--| |---------------------------------------更长的消息--|或 |----------更长的消息--||--消息------ ------更长的消息--||------------------------更长的消息--| 有任何想法吗?我正在使用Swift 1.2Xcode 6.3(和Storyboard) 谢谢!

【问题讨论】:

我用我使用的约束和代码更新了我的答案。我不需要调整水平压缩或内容拥抱。希望有帮助! :) (还没学过 Swift,对不起 Objective-C!) 【参考方案1】:

为单元格添加一个(较低优先级)固定高度约束(例如 = 40)。

为每个标签添加顶部和底部约束。将顶部约束设为固定边距(例如 = 8)。将底部约束设为(更高优先级)大于或等于约束(例如 >= 8)。

单元格的高度将由较高的标签确定,并且仍然满足所有其他垂直约束。

更新:

事实证明,您不需要为单元格设置固定高度约束,甚至不需要调整水平内容拥抱或抗压优先级。

我将标签的顶部和左侧或右侧边缘固定到 superview.margin,= 0,并在标签之间添加了一个水平空间 >= 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;

【讨论】:

这些天一直在苦苦挣扎,但似乎我错过了一些东西。你能更详细地向我解释一下吗?顶部和底部约束似乎很好。问题出在水平的..这就像两个标签之间的约束不起作用,高度由其中一个根据内容拥抱确定 - 压缩阻力值,女巫我不太明白我必须设置的值.谢谢! 您希望标签的宽度相等吗? 不,我只是希望它们与最左边的距离最小(例如 >= 4)并排排列 y - 对齐(中心,顶部现在没关系)有一个前导空格,最右边有一个尾随空格。 好的。因此,如果一个标签比另一个需要更多的水平空间,自动布局需要知道一个标签是否应该让出空间给另一个。那是抗压优先级。抗压性说“这就是我想要的尺寸。我不会让你让我变窄的。” 谢谢你!现在它工作正常!我错过了宽度限制。再次感谢您的时间!

以上是关于具有动态高度的 UITableViewCell 中的多个 UILabel的主要内容,如果未能解决你的问题,请参考以下文章

具有动态高度的 UITableView 和 UITableViewCell 仅在 WillDisplay 中知道

Swift / 如何使用具有动态高度的 UITextView INSIDE UITableViewCell 与动态高度

Autolayout - 当一个视图具有动态高度时,在 UITableViewCell 中垂直居中两个视图

具有动态内容、动态布局和动态高度的 UITableViewCell

具有动态高度的 UITableViewCell 中的 UILabel

UITableViewCell 具有嵌入式垂直堆栈视图设置,具有自动布局和动态高度