ios8自动布局:多行(可能是0行)标签

Posted

技术标签:

【中文标题】ios8自动布局:多行(可能是0行)标签【英文标题】:ios8 autolayout: BOTH multi-line(maybe 0 line) label 【发布时间】:2015-01-27 03:51:13 【问题描述】:

我想在一个单元格中显示两个 UILabel(Title, Subtitle)。代表标题:多行 > 0代表副标题: 0 多行 2 这里有个bug(比如说title&subtitle都是2行,单元格的indexPath.row = 1): 我第一次运行模拟器时,标题只显示 1 行,副标题显示 2 行。在我滚动 tableView 并返回到第一个 indexPath.row 后,它显示正确!好像是这样的:

第一次: —————————————————— 这是图块,应该显示...这是副标题,应该显示 2 行。 —————————————————— 滚动并返回此单元格后: —————————————————— 这是标题,它应该显示 两行。这是字幕,应该显示 2 行。 ——————————————————

我做了什么: 在控制器中:tableView.estimatdRowHeight = 79 tableView.rowHeight = UITableViewAutomaticDimension 在故事板中: 标题:

    引领空间到superview 超级视图的尾随空间 Superview 的顶部空间 前导与副标题对齐 将尾随与字幕对齐 字幕的底部空间

对于字幕:

    超级视图的底部空间 对齐标题到标题 将尾随与标题对齐 标题的顶部空间

我为这个错误困惑了好几天,有什么想法可以解决这个问题吗?非常感谢!!!(对不起,因为我没有足够的声誉,所以缺少图像>

【问题讨论】:

【参考方案1】:

从情节提要加载的单元格的初始宽度不正确。

这就是为什么标签第一次没有正确调整大小,但在您(重新加载数据,或)将单元格滚动到屏幕外,然后在屏幕上时正确显示的原因。

由于单元格宽度最初不正确,因此标签最终使用比表格更宽的preferredMaxLayoutWidth。 (标签认为它有更多空间可以将所有内容放在一行中。)

对我有用的解决方案是确保我的(子类)单元格的宽度与 tableView 的宽度匹配:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

    TableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];

    [cell adjustSizeToMatchWidth:CGRectGetWidth(self.tableView.frame)];

    [self configureCell:cell forRowAtIndexPath:indexPath];

    [cell setNeedsUpdateConstraints];
    [cell updateConstraintsIfNeeded];

    return cell;

在 TableViewCell.m 中:

- (void)adjustSizeToMatchWidth:(CGFloat)width

    // Workaround for visible cells not laid out properly since their layout was
    // based on a different (initial) width from the tableView.

    CGRect rect = self.frame;
    rect.size.width = width;
    self.frame = rect;

    // Workaround for initial cell height less than auto layout required height.

    rect = self.contentView.bounds;
    rect.size.height = 99999.0;
    rect.size.width = 99999.0;
    self.contentView.bounds = rect;

我还建议您查看smileyborg 的excellent answer about self-sizing cells,以及他的sample code。当我遇到与您遇到的相同问题时,这就是让我找到解决方案的原因。

【讨论】:

以上是关于ios8自动布局:多行(可能是0行)标签的主要内容,如果未能解决你的问题,请参考以下文章

具有自动布局的多行UILabel,如何在不更改标签框架的情况下根据内容调整字体大小?

iOS:自动布局中的多行 UILabel

UITableViewCell 中多个 UIlable 的自动布局

使用故事板、自动布局和 Swift 的多行 UILabel 和 UITextView

iOS:多行 uilabel 仅显示带有自动布局的一行

两个堆栈视图中的多行视图的自动布局问题