iOS 有时会自动调整单元格标签的大小

Posted

技术标签:

【中文标题】iOS 有时会自动调整单元格标签的大小【英文标题】:iOS Autoresizing Cell Labels Sometimes Clipped 【发布时间】:2017-06-14 20:40:52 【问题描述】:

我正在编写一个应用程序(针对 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

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

这一切都很好——直到内容标签超出单元格的宽度一点点。如果单元格稍微超出单元格末尾,则单元格会正确调整大小,然后隐藏此内容。但是,一旦达到一定的环绕长度,无论行数如何,它都会正确显示。这是一个屏幕截图。在这里,“长度”项的内容是“这是一个超长的 sn-p,因为我们需要看看标签在(几乎)延伸到多行时的行为。” “电源循环”项的内容是“您是否尝试过关闭并重新打开?”奇怪,对吧? 仅添加“请告知”。到“长度”项的末尾会导致它按预期呈现,如下所示(甚至是一个不错的动画更改)。

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

还可能值得注意(更明确地),当我使用字符串大小的相关 API 手动计算单元格高度并在 tableView(_:heightForRowAt:) 中明确分配这些高度时,此问题仍然存在。

这几天我一直在为这个问题烦恼。我写了很多很多的修复,包括一些奇怪的修复,甚至一些使用 CoreText 和朋友的修复。没有任何工作正常。 iOS 6 和公司的旧修复程序不起作用。这里有东西,我找不到。

提前感谢您的帮助!


在您向我提出其他问题之前,请注意,我已经花费了数小时在 Internet(Stack Overflow 和其他地方)上搜索该问题的解决方案,但所有可用的解决方案都不适用于我的情况。发布带有指向另一个问题或博客文章的链接的自鸣得意、尖刻的回复可能无济于事,而且只会令人讨厌。相关地,请不要告诉我只使用默认单元格样式。

【问题讨论】:

我目前无法自己检查,但请尝试更改为 .byTruncatingTail.byClipping ...我认为其中一个比 word-包装。 @DonMag 正如预期的那样,.byTruncatingTail 仅在单词被剪裁时显示省略号,这虽然比不显示任何删除指示的当前行为要好,但并不是我的行为想。 .byClipping 与现有行为类似,但在进入编辑模式时显示部分单词。不过,感谢您的想法! 好吧,如果你正在寻找“尝试的东西”来帮助解决这个问题......我很好奇 - 如果你设置了特定的字体而不是 UIFont.preferredFont(forTextStyle:),你看到任何区别? 我只是使用了您使用的确切配置,我没有遇到任何截断问题。我认为您提供的信息不是这里的问题。您必须在表格视图或标签中添加了一些其他属性,这可能会干扰这里。 @DonMag 我确实尝试过使用其他字体,但问题仍然存在(假设溢出条件的大小正确)。 【参考方案1】:

事实证明,我看到的奇怪现象是我之前尝试过的一种轻率的“解决方案”的结果。在我对我的代码的所有审查中,我的眼睛都在盯着它,所以它从未被删除。

在表的委托的tableView(_:cellForRowAt:) 方法中,我在返回之前做了以下坏事:

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

你会认为我会更清楚。感谢那些试图帮助我摆脱愚蠢的人!

【讨论】:

以上是关于iOS 有时会自动调整单元格标签的大小的主要内容,如果未能解决你的问题,请参考以下文章

在 IOS 8 中使用自动布局调整单元格大小

如何在不指定估计行高的情况下使用 iOS 自动调整单元格大小?

CollectionView 单元格高度不会自动调整大小

无法使用自动布局将简单的自行调整大小的集合视图单元格调整为标签大小

根据文本调整单元格宽度 - UICollectionView - iOS

UITableView 单元格不使用标签文本自动调整大小