自定义UITableViewCell内的UILabel没有以正确的大小绘制

时间:2009-10-06 17:14:12

标签: iphone

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

Screenshot of UILabel problem

在此示例中,整个文本块的高度应为90(在Interface Builder中检查),这是从sizeWithFont返回的值。它也是UILabel框架设置的高度,我通过记录以及停止执行和检查值来验证。但是,正如您所看到的,显然绘制完整的90像素高,尽管它正确地为其分配空间(“已编辑”上方的细黑线是表格单元格边框)。我完全感到困惑。如果有人能够提供一些关于它为何如此行事的见解,我将非常感激。

3 个答案:

答案 0 :(得分:7)

最后,一个解决方案!

原来这个单元格做了两次布局 - 一次是在heightForRowAtIndexPath期间,这是我调整子视图和单元格的所有高度的地方,后来是在一些源自__CFRunLoopDoObservers的无法追踪的事务中。我是如何追踪这个的?我添加了一个layoutSubviews覆盖到我的自定义表视图单元类,所以我可以断点它。

在第二次传递期间,最后一个UILabel子视图被设置为比我设置的更短的高度,可能符合一些神秘的自动调整规则。 (是的,我尝试首先调整所有这些设置,但没有成功。)事实证明,在layoutSubviews中什么也不做就禁用了这个框架行为,允许我完全控制我的视图绘制方式。

答案 1 :(得分:1)

使用iOS 8它不再像这样工作了。单独实现layoutSubviews不起作用,因为调用方法时子视图的布局已经改变。

我找到了2个解决方案:

  1. 添加NSLayoutConstraint以编程方式布局子视图
  2. 实施子视图的layoutSubviews并更改框架
  3. 解决方案2的一个例子:

    - (void)layoutSubviews
    {
        [super layoutSubviews];
    
        CGRect frame = self.frame;
        frame.size.height = 39.f;
        self.frame = frame;
    }
    

答案 2 :(得分:0)

我遇到了类似的问题。这与在细胞的先前化身中设置的其他属性有关。为了找到它/证明它,我改变了违规单元的重复使用,以确保它是一个独特的单元格。