UITableCell 中的 UILabel 大小不正确,直到 UITableView 滚动

Posted

技术标签:

【中文标题】UITableCell 中的 UILabel 大小不正确,直到 UITableView 滚动【英文标题】:UILabel within UITableCell has an incorrect size until UITableView is scrolled 【发布时间】:2016-12-09 11:23:12 【问题描述】:

有一个问题,即 UITableViewCell 中自动调整大小的 UILabel 在加载视图时具有不正确的框架,但在表格滚动时,标签大小会神奇地更新,因此框架是正确的。

这是单元格内标签的约束,这里没有歧义,所以表格应该自动选择大小没问题:

我也在代码中配置了一些 UI,如下所示:

[self.label setText:localFieldObject.value];
[self.label setDelegate:self];
[self.label setLineBreakMode:NSLineBreakByWordWrapping];
[self.label setNumberOfLines:0];
[self.label layoutIfNeeded];

请注意,如果我在layoutIfNeeded 上中断,尽管刚刚设置了行数,但它是零。不过self.label 确实有值。

我还使用视图调试器检查滚动前后的帧,看起来单元格的大小在两种情况下都正确,但单元格内标签的框架正在发生变化,但约束没有变化。我尝试了来自类似问题的各种建议,但目前还没有解决问题。

如果您有任何进一步的信息想问;提前致谢。

【问题讨论】:

你在哪里调用这些代码? 代码在awakeFromNib 中有效调用,肯定是在从笔尖加载视图之后。从self.label 不为零这一事实可以清楚地看出这一点。 尝试将[self.label layoutIfNeeded];更改为[self.contentView layoutIfNeeded];,标签的子视图不需要布局 self.layoutIfNeeded 无论如何都会调用self.contentView.layoutIfNeeded,因为contentViewself 的子视图,layoutIfNeeded 会在整个视图层次结构中回显。 那行得通吗? 【参考方案1】:

您需要在返回单元格之前调用[cell layoutIfNeeded]; 以强制进行布局。

根据我的经验,尽量避免将布局代码放在awakeFromNib 中,因为这会在视图显示给用户之前被覆盖。通常,您无需在返回单元格之前调用 layoutIfNeeded,但在某些情况下,您可以在 cellForRow 末尾调用。

【讨论】:

以上是关于UITableCell 中的 UILabel 大小不正确,直到 UITableView 滚动的主要内容,如果未能解决你的问题,请参考以下文章

Uilabel 和一个表格单元

实现可变大小的多行 UITableCell 的最佳方法是啥?

UITableCell 高度未正确调整

iOS:多行 UILabel 与水平 UIStackView 中的另一个 UILabel 大小错误

如何制作可拉伸的自定义 UITablecell

根据自动布局更改 UILabel 中的字体大小(swift)