首页 > 解决方案 > 将最小部署目标升级到 iOS 14 后 UICollectionView 停止显示单元格

问题描述

我有两个大 UICollectionViewCells 的屏幕。使用 XIB 作为界面生成器。UICollectionView DataSource 和 Delegate 连接到包含它的 UIViewController。已安装复选标记为真。isHidden 是假的。单元格和 UICollectionView 的 Alpha 1。我还使用正确的标识符为 UICollectionView 注册了单元格。

在我从最小部署目标 iOS 13 更新我的项目之前 - UICollectionView 工作正常。升级到 iOS 14 最低部署后 - UICollectionView 不显示单元格。如果我在没有任何代码库更改的情况下将最小部署返回到 iOS 13 - 工作正常。

请任何人保护我的时间,因为我已经浪费了一整天没有运气!提前致谢!

标签: iosswiftuicollectionviewstoryboardxib

解决方案


所以我找到了这个非常奇怪的错误的原因。我的目标是使用包含灵活 UITextField 的单元格创建 UICollectionView。用户在书写时 - 单元格会根据文本字段中的文本高度更改其大小。

为了实现它,我为我的 UICollectionView 使用了这些配置: 带有 UICollectionView 配置的图像

这里可以看到“Cell Size”宽度为0,“Estimate Size”是自动的。它配置为灵活的单元格高度。

为了使它工作,我还添加了以下代码:

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    guard let flowLayout = collectionView.collectionViewLayout as? UICollectionViewFlowLayout,
          flowLayout.estimatedItemSize.width == .greatestFiniteMagnitude else {
        return
    }
    flowLayout.estimatedItemSize = CGSize(
        width: view.frame.width - Size.verticalCollectionInsetsDistance * 2,
        // Make the height a reasonable estimate to
        // ensure the scroll bar remains smooth
        height: 200
    )
}

这里有一个技巧:当我将我的应用程序升级到 iOS 14 最低部署时,此代码已损坏。因为,由于某种原因,当您将“单元大小”宽度设置为 0 并且您有 iOS 13 最小部署时,那么估计的ItemSize.width == .greatestFiniteMagnitude 为真。但是对于 iOS 14 来说,estimatedItemSize.width == .greatestFiniteMagnitude 是假的,而estimatedItemSize.width == 0 是真的。所以现在我通过添加这个条件“flowLayout.estimatedItemSize.width == 0”来修复我的代码。这是最终版本:

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    guard let flowLayout = collectionView.collectionViewLayout as? UICollectionViewFlowLayout,
          flowLayout.estimatedItemSize.width == .greatestFiniteMagnitude || flowLayout.estimatedItemSize.width == 0 else {
        return
    }
    flowLayout.estimatedItemSize = CGSize(
        width: view.frame.width - Size.verticalCollectionInsetsDistance * 2,
        // Make the height a reasonable estimate to
        // ensure the scroll bar remains smooth
        height: 200
    )
}

PS 我仍然不明白为什么 iOS 14estimateItemSize.width 与 iOS 13 不同。如果你知道答案,请在评论中描述。提前致谢!


推荐阅读