将最小部署目标升级到 iOS 14 后,UICollectionView 停止显示单元格
Posted
技术标签:
【中文标题】将最小部署目标升级到 iOS 14 后,UICollectionView 停止显示单元格【英文标题】:UICollectionView stopped showing cells after upgrading minimum deployment target to iOS 14 【发布时间】:2021-07-17 01:01:19 【问题描述】:我有两个大 UICollectionViewCells 的屏幕。使用 XIB 作为界面生成器。 UICollectionView DataSource 和 Delegate 连接到包含它的 UIViewController。 已安装复选标记为真。 isHidden 是假的。单元格和 UICollectionView 的 Alpha 1。我还使用正确的标识符为 UICollectionView 注册了单元格。
在我从最低部署目标 ios 13 更新我的项目之前 - UICollectionView 工作正常。升级到 iOS 14 最低部署后 - UICollectionView 不显示单元格。如果我在没有任何代码库更改的情况下将最小部署返回到 iOS 13 - 工作正常。
请任何人保护我的时间,因为我已经浪费了一整天没有运气!提前致谢!
【问题讨论】:
iOS 14 设备是否可以在暗模式下,低版本崩溃总是有可能的,但高版本崩溃可能不是版本造成的。如果基础相似,则需要调试 @MahmutBedir 实际上,我遇到了更高版本有问题的情况。此外,它不是崩溃,而是出现错误。因为数据源方法按预期调用。 能不能把项目分享到github上,我们可以看看 【参考方案1】:所以我找到了这个非常奇怪的错误的原因。我的目标是使用包含灵活 UITextField 的单元格创建 UICollectionView。用户在书写时 - 单元格会根据文本字段中的文本高度更改其大小。
为了实现它,我为我的 UICollectionView 使用了这些配置: Image with UICollectionView configurations
这里可以看到“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
)
附:我仍然不明白为什么 iOS 14estimatedItemSize.width 与 iOS 13 不同。如果您知道答案,请在 cmets 中描述。提前致谢!
【讨论】:
以上是关于将最小部署目标升级到 iOS 14 后,UICollectionView 停止显示单元格的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 iOS 14+ 的 ScrollViewReader 和 iOS 13 的部署目标
发布 iOS 应用后,是不是可以将部署目标从 iOS8 更改为 iOS7?
支持的部署目标版本范围是 9.0 到 14.55 Error While Running Flutter App on iOS Simulator