将最小部署目标升级到 iOS 14 后,UICollectionView 停止显示单元格
UICollectionView stopped showing cells after upgrading minimum deployment target to iOS 14
我的屏幕有两个大的 UICollectionViewCells。使用 XIB 作为界面生成器。 UICollectionView 数据源和委托连接到包含它的我的 UIViewController。
已安装复选标记为真。 isHidden 为假。单元格和 UICollectionView 的 Alpha 1。我还用正确的标识符为 UICollectionView 注册了单元格。
在我从最小部署目标更新我的项目之前 iOS 13 - UICollectionView 工作正常。升级到 iOS 14 最小部署后 - UICollectionView 不显示单元格。如果我 return 最小部署到 iOS 13 没有任何代码库更改 - 工作正常。
请任何人保护我的时间,因为我已经浪费了一整天,没有运气!提前致谢!
所以我找到了这个非常奇怪的错误的原因。我的目标是使用包含灵活 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 最小部署时,此代码已损坏。因为,出于某种原因,当您将“Cell Size”宽度设置为 0 并且您有 iOS 13 最小部署时,那么 estimatedItemSize.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
)
}
P.S。我仍然不明白为什么 iOS 14 estimatedItemSize.width 与 iOS 13 不同。如果您知道答案,请在评论中描述。提前致谢!
我的屏幕有两个大的 UICollectionViewCells。使用 XIB 作为界面生成器。 UICollectionView 数据源和委托连接到包含它的我的 UIViewController。 已安装复选标记为真。 isHidden 为假。单元格和 UICollectionView 的 Alpha 1。我还用正确的标识符为 UICollectionView 注册了单元格。
在我从最小部署目标更新我的项目之前 iOS 13 - UICollectionView 工作正常。升级到 iOS 14 最小部署后 - UICollectionView 不显示单元格。如果我 return 最小部署到 iOS 13 没有任何代码库更改 - 工作正常。
请任何人保护我的时间,因为我已经浪费了一整天,没有运气!提前致谢!
所以我找到了这个非常奇怪的错误的原因。我的目标是使用包含灵活 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 最小部署时,此代码已损坏。因为,出于某种原因,当您将“Cell Size”宽度设置为 0 并且您有 iOS 13 最小部署时,那么 estimatedItemSize.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
)
}
P.S。我仍然不明白为什么 iOS 14 estimatedItemSize.width 与 iOS 13 不同。如果您知道答案,请在评论中描述。提前致谢!