我有一个自定义表格单元格,其中包含许多UILabel。在运行时,我正在使用sizeWithFont:constrainedToSize:lineBreakMode:
调整标签的高度以适合其内容并相应地重新定位它们。单元格中的最后一个标签包含大量文本,导致它换行,我有一个非常奇怪的问题。虽然sizeWithFont
调用返回正确的大小,并且我将UILabel的帧设置为该高度,但它会缩短几行。这个截图说明了我在说什么:
在此示例中,整个文本块的高度应为90(在Interface Builder中检查),这是从sizeWithFont
返回的值。它也是UILabel框架设置的高度,我通过记录以及停止执行和检查值来验证。但是,正如您所看到的,显然不绘制完整的90像素高,尽管它正确地为其分配空间(“已编辑”上方的细黑线是表格单元格边框)。我完全感到困惑。如果有人能够提供一些关于它为何如此行事的见解,我将非常感激。
答案 0 :(得分:7)
最后,一个解决方案!
原来这个单元格做了两次布局 - 一次是在heightForRowAtIndexPath期间,这是我调整子视图和单元格的所有高度的地方,后来是在一些源自__CFRunLoopDoObservers的无法追踪的事务中。我是如何追踪这个的?我添加了一个layoutSubviews覆盖到我的自定义表视图单元类,所以我可以断点它。
在第二次传递期间,最后一个UILabel子视图被设置为比我设置的更短的高度,可能符合一些神秘的自动调整规则。 (是的,我尝试首先调整所有这些设置,但没有成功。)事实证明,在layoutSubviews中什么也不做就禁用了这个框架行为,允许我完全控制我的视图绘制方式。
答案 1 :(得分:1)
使用iOS 8它不再像这样工作了。单独实现layoutSubviews
不起作用,因为调用方法时子视图的布局已经改变。
我找到了2个解决方案:
NSLayoutConstraint
以编程方式布局子视图layoutSubviews
并更改框架解决方案2的一个例子:
- (void)layoutSubviews
{
[super layoutSubviews];
CGRect frame = self.frame;
frame.size.height = 39.f;
self.frame = frame;
}
答案 2 :(得分:0)
我遇到了类似的问题。这与在细胞的先前化身中设置的其他属性有关。为了找到它/证明它,我改变了违规单元的重复使用,以确保它是一个独特的单元格。