【问题标题】:UILabel inside custom UITableViewCell not drawing at the correct size自定义 UITableViewCell 中的 UILabel 未以正确的大小绘制
【发布时间】:2010-12-04 08:34:09
【问题描述】:

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

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

【问题讨论】:

  • same topic 上查看我的回答。
  • 这个答案很好地概述了我已经在做的所有事情:-)
  • 进度:这是因为 IB 中设置的单元格高度高于 heightForRowAtIndexPath 返回的实际高度。当单元格被碾压时,最底部的 UILabel 似乎也发生了一些剪裁。

标签: iphone


【解决方案1】:

终于有办法了!

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

在第二遍中,最后一个 UILabel 子视图的高度被设置为比我设置的要短,这可能是根据一些神秘的自动调整大小规则。 (是的,我首先尝试调整所有这些设置,但没有成功。)事实证明,仅仅在 layoutSubviews 中什么都不做就禁用了这个框架行为,让我可以完全控制视图的绘制方式。

【讨论】:

    【解决方案2】:

    在 iOS 8 中,它不再像这样工作了。单独实现layoutSubviews 并不能解决问题,因为在调用该方法时,子视图的布局已经发生了变化。

    我找到了 2 个解决方案:

    1. 添加NSLayoutConstraint 以编程方式布局子视图
    2. 实现子视图的layoutSubviews并改变框架

    解决方案 2 的示例:

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

    【讨论】:

      【解决方案3】:

      我也遇到过类似的问题。这与在单元格的先前化身中设置的其他属性有关。为了找到它/证明它,我更改了有问题的单元格的重用标识符,以确保它是一个唯一的单元格。

      【讨论】:

      • 有趣...我会调查一下。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多