我有一个自定义表格单元格,其中包含许多UILabel.在运行时,我正在调整标签的高度以适应其内容sizeWithFont:constrainedToSize:lineBreakMode:并相应地重新定位它们.单元格中的最后一个标签包含大量文本,导致它换行,我有一个非常奇怪的问题.尽管sizeWithFont调用返回了正确的大小,并且我将UILabel的帧设置为该高度,但它会缩短几行.这个截图说明了我在说什么:

在此示例中,整个文本块的高度应为90(在Interface Builder中检查),这是从中返回的sizeWithFont.它也是UILabel框架设置的高度,我通过记录以及停止执行和检查值来验证.但是,正如您所看到的,尽管它正确地为它分配了空间,但它显然没有绘制完整的90像素高("编辑"上方的细黑线是表格单元格边框).我完全感到困惑.如果有人能够提供一些有关它为何如此表现的见解,我将非常感激.
最后,一个解决方案!
事实证明,单元格布局两次 - 一次是在heightForRowAtIndexPath期间,这是我调整子视图和单元格的所有高度的地方,稍后是在__CFRunLoopDoObservers中的一些无法追踪的事务中.我是如何追踪这个的?我添加了一个layoutSubviews覆盖到我的自定义表视图单元类,所以我可以断点它.
在第二次传递期间,最后一个UILabel子视图被设置为比我设置的更短的高度,可能是根据一些神秘的自动调整规则.(是的,我尝试首先调整所有这些设置,但没有成功.)事实证明,在layoutSubviews中什么都不做就禁用了这个框架行为,允许我完全控制我的视图绘制方式.