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
,因为contentView
是self
的子视图,layoutIfNeeded
会在整个视图层次结构中回显。
那行得通吗?
【参考方案1】:
您需要在返回单元格之前调用[cell layoutIfNeeded];
以强制进行布局。
根据我的经验,尽量避免将布局代码放在awakeFromNib
中,因为这会在视图显示给用户之前被覆盖。通常,您无需在返回单元格之前调用 layoutIfNeeded
,但在某些情况下,您可以在 cellForRow
末尾调用。
【讨论】:
以上是关于UITableCell 中的 UILabel 大小不正确,直到 UITableView 滚动的主要内容,如果未能解决你的问题,请参考以下文章
实现可变大小的多行 UITableCell 的最佳方法是啥?