我正在编写一个应用程序(针对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
为.byWordWrapping
,numberOfLines
设为0
。当然,translatesAutoresizingMaskIntoConstraints
设置为false
。它们使用UIFont.preferredFont(forTextStyle:)
分配字体。
这一切都运行良好 - 直到内容标签超过单元格的宽度一点点。如果单元格稍微超出单元格的末尾,则单元格会正确调整大小,然后隐藏此内容。但是,无论行数是多少,一旦达到某个环绕长度,它就会正确显示。这是一个截图。在这里,“长度”项目的内容是“这是一个超级duper长片段,因为我们需要看看标签在它们(超过几乎没有)延伸到多行时的行为。” “Power Cycle”项目的内容是“您是否尝试将其关闭并重新打开?”奇怪吧? 添加一个“请建议。”到“长度”项目的结尾会导致它按预期呈现,如下所示(这甚至是一个很好的动画更改)。
内容标签具有较低的内容拥抱优先级,而名称标签具有较高的内容标签。内容标签具有较高的内容抗压缩优先级,名称标签较低。
当我使用相关API手动计算单元格大小的字符串高度并在 我已经在这个问题上撕掉我的头发好几天了。我写了很多很多修复,包括一些奇怪的修复,甚至一些使用CoreText和朋友。没有什么工作正常。 iOS 6和公司的旧修复程序不起作用。有些东西在这里,我找不到它。 提前感谢您的帮助! 在您向我推荐其他问题之前,请知道我花了数小时和数小时搜索互联网(Stack Overflow和其他地方)来解决此问题,并且所有可用的解决方案都不适用于我的情况。通过链接到另一个问题或博客帖子发布一个自鸣得意的,讽刺性的回复可能没有帮助,而且只是令人讨厌。相关地,请不要告诉我只使用默认的单元格样式。tableView(_:heightForRowAt:)
中明确指定这些高度时,此问题仍然值得注意(>此问题仍然存在。< / p>
答案 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
}
你认为我知道的更好。感谢那些试图帮助我愚蠢的人!