当UICollectionViewCell Autolayout 失效时
2024-01-28 18:02:19
iOS 12 遗留的 UI 漏洞:修复 UICollectionViewCell Autolayout
iOS 12 原本是给我们带来无限喜悦的,却带来了一个令人沮丧的 UI 漏洞:<UICollectionViewCell>
的 autolayout
自适应高度和 size
计算不再起作用。这个漏洞困扰着我们,甚至让我们怀疑自己的代码能力。
漏洞根源
这个漏洞似乎源于苹果对 UICollectionView
布局引擎的一些改动。在 iOS 12 之前,UICollectionView
使用 FlowLayout
来计算每个 UICollectionViewCell
的大小。而在 iOS 12 中,苹果引入了一种新的布局引擎,称为 CollectionLayout
。
CollectionLayout
旨在提高性能和灵活性,但它也带来了意想不到的后果,破坏了 UICollectionViewCell
中使用 autolayout
自适应高度和 size
的能力。
症状
受影响的 UICollectionViewCell
表现出以下症状:
- 自适应高度不起作用,所有单元格都采用默认高度。
- 通过
sizeToFit()
计算的大小不正确,导致单元格内容被截断或溢出。
诊断
要诊断此问题,请执行以下步骤:
- 确保您的
UICollectionViewCell
使用autolayout
来约束其内容。 - 确保您使用
iOS 12 SDK
。 - 在模拟器或真机上运行您的应用程序。
解决方法
虽然苹果尚未提供官方修复程序,但有几种解决方法可以缓解这个问题:
禁用 CollectionLayout
您可以通过设置 collectionView.collectionViewLayout = nil
来禁用 CollectionLayout
引擎。这将迫使 UICollectionView
使用旧的 FlowLayout
,恢复 autolayout
的正常功能。
手动计算单元格大小
您可以使用 systemLayoutSizeFitting(_:)
方法手动计算每个 UICollectionViewCell
的大小。此方法需要您提供一个 UICollectionViewLayoutAttributes
对象,它指定了单元格的约束。
使用第三方库
有几个第三方库可以帮助解决此问题。例如,UICollectionView-Autolayout 库提供了一个修复程序,可以使 autolayout
在 CollectionLayout
中正常工作。
最佳实践
为了避免此问题,请遵循以下最佳实践:
- 在可能的情况下,使用
systemLayoutSizeFitting(_:)
方法手动计算单元格大小。 - 避免在
UICollectionViewCell
中使用复杂的autolayout
约束。 - 测试您的应用程序在不同版本的 iOS 上的行为,包括 iOS 12。
常见问题解答
Q1. 这个漏洞会影响哪些设备?
A1. 此漏洞影响运行 iOS 12 及更高版本的设备。
Q2. 我可以用相同的解决方法解决所有受影响的 UICollectionViewCell
吗?
A2. 是的,上述解决方法适用于所有受影响的 UICollectionViewCell
。
Q3. autolayout
仍然可以在其他上下文中使用吗?
A3. 是的,autolayout
仍然可以在 UICollectionViewCell
之外的其他上下文中使用。
Q4. 苹果是否知道此漏洞?
A4. 是的,苹果已确认此漏洞,并表示正在研究修复程序。
Q5. 我需要担心其他类似的漏洞吗?
A5. 随时可能出现新的漏洞,因此保持警惕并定期测试您的应用程序非常重要。
结论
<UICollectionViewCell>
的 autolayout
在 iOS 12 中的失效是一个恼人的漏洞,但它可以通过使用上述解决方法来缓解。通过遵循最佳实践,您还可以减少此漏洞对您的应用程序的影响。希望苹果能够尽快发布官方修复程序,以永久解决此问题。