返回

当UICollectionViewCell Autolayout 失效时

IOS

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 库提供了一个修复程序,可以使 autolayoutCollectionLayout 中正常工作。

最佳实践

为了避免此问题,请遵循以下最佳实践:

  • 在可能的情况下,使用 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 中的失效是一个恼人的漏洞,但它可以通过使用上述解决方法来缓解。通过遵循最佳实践,您还可以减少此漏洞对您的应用程序的影响。希望苹果能够尽快发布官方修复程序,以永久解决此问题。