有没有不使用 sizeToFit 计算 UILabel 大小的准确方法?

Posted

技术标签:

【中文标题】有没有不使用 sizeToFit 计算 UILabel 大小的准确方法?【英文标题】:Is there any accurate way of calculating size of UILabel without using sizeToFit? 【发布时间】:2017-04-13 11:43:21 【问题描述】:

我知道这个问题是一个很长的问题,但我只是想知道是否有人找到了更好的解决方案。使用 boundingRect 并不准确,因为它不适用于自动换行。我不想使用 sizeToFit 的原因是,当有很多标签要计算时,它会导致相当大的性能损失,从而导致滚动过程中出现抖动(我正在使用 UICollectionView)。

【问题讨论】:

【参考方案1】:

有一种内部方法使sizeToFit 成为可能 - sizeThatFits(_ size: CGSize) -> CGSize。您可以使用它来计算大小,而无需实际重新布局视图。

除了没有别的。正如您所提到的,有很多方法可以计算具有不同字体/属性/其他内容的字符串的边界框,但它们总是有点偏离,因为 UI 控件具有不可公开访问的内部布局或边距。即使你现在让它工作,它也会从 ios 到 iOS 发生很大变化。

作为一种解决方案,我建议缓存尺寸。在模型更改、旋转或集合视图宽度更改时失效。

【讨论】:

感谢您的快速回复。我会尽快测试性能并更新结果。 sizeThatFits 确实返回了正确的结果,但总的来说我仍然无法解决抖动问题,我相信 AsyncDisplayKit 就是为此而生的。 只需运行仪器时间分析器并重现 jankiness 是的,我正在使用仪器分析器,但我认为它不是一个可以轻松解决的问题。在我的情况下,我使用的是 UICollectionView,并且 cellforrowatindexpath 方法在开始丢帧之前必须是超级最优的。我的单元格有很多具有动态高度的组件,这使它变得更加复杂。 AsyncDisplayKit(现在称为 Texture)是我现在使用的,到目前为止效果很好,我强烈推荐它。 我建议也尝试仅使用 layoutSubviews 或仅手动计算高度(基于布局)而不使用 sizeThatFits

以上是关于有没有不使用 sizeToFit 计算 UILabel 大小的准确方法?的主要内容,如果未能解决你的问题,请参考以下文章

IOS UILlabel sizeToFit

在带有阴影的 UILabel 上使用 SizeToFit()?

为啥此代码中需要“sizeToFit”调用?

UILabel 中 sizeToFit 的高度不正确

sizeToFit() 返回错误的高度 - 需要在 heightForRow 中查找单元格宽度

sizeToFit 如何确定合适的尺寸?