iOS自动调整单元格标签有时会被剪切

时间:2017-06-14 20:40:52

标签: ios uitableview autolayout uikit uilabel

我正在编写一个应用程序(针对iOS 10+,使用Xcode 8.3.3中的iOS 10.3 SDK构建),该应用程序向用户显示简单的表格视图。该表视图由一组表示用户定义对象的单元组成,这些对象具有可选标题和强制(短)内容。要显示这些内容,我自然会使用UILabel

我也在尝试使用自动调整单元格。发生所有魔术的视图控制器是UITableViewController的子类(具有分组的表视图),并且在其loadView方法中,我将其配置为使用自动调整大小

tableView.rowHeight = UITableViewAutomaticDimension
tableView.estimatedRowHeight = 21

然后我使用以下约束配置单元格(使用符号缩写):

  • nameLabel.topMargin = contentView.topMargin
  • nameLabel.leftMargin = contentView.leftMargin
  • nameLabel.rightMargin = contentView.rightMargin
  • contentLabel.leftMargin = contentView.leftMargin
  • contentLabel.rightMargin = contentView.rightMargin
  • contentLabel.topMargin = nameLabel.bottomMargin
  • contentView.bottomMargin = contentLabel.bottomMargin

标签的lineBreakMode.byWordWrappingnumberOfLines设为0。当然,translatesAutoresizingMaskIntoConstraints设置为false。它们使用UIFont.preferredFont(forTextStyle:)分配字体。

这一切都运行良好 - 直到内容标签超过单元格的宽度一点点。如果单元格稍微超出单元格的末尾,则单元格会正确调整大小,然后隐藏此内容。但是,无论行数是多少,一旦达到某个环绕长度,它就会正确显示。这是一个截图。在这里,“长度”项目的内容是“这是一个超级duper长片段,因为我们需要看看标签在它们(超过几乎没有)延伸到多行时的行为。” “Power Cycle”项目的内容是“您是否尝试将其关闭并重新打开?”奇怪吧? Screenshot 添加一个“请建议。”到“长度”项目的结尾会导致它按预期呈现,如下所示(这甚至是一个很好的动画更改)。Longer Screenshot

内容标签具有较低的内容拥抱优先级,而名称标签具有较高的内容标签。内容标签具有较高的内容抗压缩优先级,名称标签较低。

当我使用相关API手动计算单元格大小的字符串高度并在tableView(_:heightForRowAt:) 中明确指定这些高度时,此问题仍然值得注意(>此问题仍然存在。< / p>

我已经在这个问题上撕掉我的头发好几天了。我写了很多很多修复,包括一些奇怪的修复,甚至一些使用CoreText和朋友。没有什么工作正常。 iOS 6和公司的旧修复程序不起作用。有些东西在这里,我找不到它。

提前感谢您的帮助!

在您向我推荐其他问题之前,请知道我花了数小时和数小时搜索互联网(Stack Overflow和其他地方)来解决此问题,并且所有可用的解决方案都不适用于我的情况。通过链接到另一个问题或博客帖子发布一个自鸣得意的,讽刺性的回复可能没有帮助,而且只是令人讨厌。相关地,请不要告诉我只使用默认的单元格样式。

1 个答案:

答案 0 :(得分:0)

事实证明,我所看到的奇怪之处是一种无法解释的解决方案&#34;我曾经尝试过。在我对我的代码的所有评论中,我的眼睛都在它上面,所以它永远不会被删除。

在表格的委托tableView(_:cellForRowAt:)方法中,我在回复之前做了以下不好的事情:

if let c = cell as? MyAwesomeCellSubclass {
    c.contentLabel.preferredMaxLayoutWidth = tableView.bounds.size.width
    c.nameLabel.preferredMaxLayoutWidth = tableView.bounds.size.width
}

你认为我知道的更好。感谢那些试图帮助我愚蠢的人!