UITableViewCell 中的 UILabel 正确使用自动布局大小但仅在旋转时换行

UILabel in UITableViewCell using Autolayout sizes correctly but only wraps on rotation

我在 UITableViews 上使用 WWDC '14 演讲中的编程约束,以便我的应用程序可以支持动态文本并自动调整我的 table 视图单元格的高度。但是,只有当我将设备旋转到横向并返回时,包装才会出现。下面的第一张图显示了这一点:最初的观点是错误的。第二个显示了我的预期,但我只有在旋转到横向并返回后才得到正确的行为。

注意单元格的大小是正确的:自动布局系统发现我需要两行 space,但文本没有换行。

我尝试设置换行模式 - 它有点管用(根据模式在字符或单词处换行,但在旋转之前我看不到字符串的其余部分)。

标签的约束与 WWDC '14 演讲中的约束相同。我没有收到自动布局投诉。我已将 UILabel 的行数设置为 0,将行高设置为 UITableViewAutomaticDimension 并设置估计行高。

有没有人见过这个并修复它?我做错了什么?

第二张图片:

我 运行 遇到了与 UICollectionViewCell 类似的问题。我想要一个可以根据需要增长的多行标签。您正在做的事情可能应该有效,尤其是因为这就是 WWDC 视频中显示的所有内容。

在调用 [super layoutSubviews] 之前,我最终在 layoutSubviews 内调用了 [label setNeedsUpdateConstraints]

使用这种方法,我 而不是 明确地将 preferredMaxLayoutWidth 设置为 0。这实际上给我带来了问题。默认的0,所以你可以不用。

我对其他同样有效的方法做了一些说明:

  • 保存标签文本,将 label.text 设置为 nil,然后将文本设置回 原来在 [super layoutSubviews].
  • 之前
  • 在[super layoutSubviews]之后,将preferredMaxLayoutWidth设置为当前标签宽度(已应用约束,只是想将布局宽度值与实际同步,然后触发一些额外的工作)

如果您没有自定义单元格 class 来执行此操作,您可以尝试从 table 视图调用 [label setNeedsUpdateConstraints] delegate/data 源方法,例如cellForRowAtIndexPath

在 UILabel 的子类中,我放置了这段代码:

- (void)layoutSubviews
{
    [super layoutSubviews];
    self.preferredMaxLayoutWidth = self.bounds.size.width;
}