UITAbleViewCell中的多个UILabel,动态高度为

时间:2015-05-15 19:06:09

标签: uitableview swift dynamic ios8 autolayout

在空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.2Xcode 6.3(和Storyboard) 谢谢!

1 个答案:

答案 0 :(得分:3)

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

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

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

<强>更新

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

我将标签的顶部和左边或右边固定到superview.margin,= 0,并在标签&gt; = 4之间添加了一个水平空格。

我将标签的下边缘固定到superview.margin,&gt; = 0.我还将两个标签的垂直压缩阻力优先级设置为1000.

此时,我们已设置了最小必要约束。但是,如果两个标签都很长,则一个标签将占据大部分宽度,从而迫使另一个标签非常窄。我随意为两个标签添加了宽度&gt; = 100约束以平衡事情。

Label constraints

-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;
}

Snapshot of tableView with dynamic side-by-side labels