iOS14 中 UICollectionview 的潜在错误

Posted

技术标签:

【中文标题】iOS14 中 UICollectionview 的潜在错误【英文标题】:Potential Bug in UICollectionview in iOS14 【发布时间】:2020-09-23 13:38:51 【问题描述】:

我在 ios14 处理 CollectionView 的方式中遇到了一个奇怪的行为。我注意到(从 iOS13.5 更改为 iOS14)UICollectionViewCells 的显示顺序是错误的。下面的图片是完全相同的代码(在 xCode12 中)的屏幕截图,唯一的区别是正确的是 iOS13.5 的构建和 iOS13.5 的 iPhone 11 模拟器,而错误的是 iOS13.5 iOS14 的构建以及 iOS14 上带有 iPhone 11 的模拟器。其他一切(代码、设置等)完全相同:

图1,集合应该如何显示(在iOS13.5中正确):

如果用iOS14构建相同的代码,并在与iOS14相同的iPhone模拟器上运行,结果如下(不是顺序错误:是倒序):

在数据源(这是一个带有标签的数组)中,一切都是正确的,并且 cellForItemAt 委托正常工作。

在 iOS14 中肯定有一些不同的处理方式。最后一个示例是另一个屏幕截图,其中框的大小不同(取决于标签的长度):

正确(为 iOS13.5 构建)是:

虽然为 iOS14 构建会产生以下结果:

同样,代码完全一样,我只是为不同的 iOS 版本构建项目。在我看来,为 iOS14 修改集合的方式可能存在错误。欢迎任何帮助或想法。

【问题讨论】:

别忘了报告“Bug Reporting - Apple Developer”。 我已经做到了。我很想知道是否有人对此问题有解决方案/解决方法(除了继续为 iOS13.5 开发)以及是否有人经历过。有趣的是,在同一个屏幕上,我还有另一个完美运行的集合。 【参考方案1】:

我已经找到了解决这个问题的方法,我认为这表明 iOS14 中 UICollectionView 的委托管理方式可能已经发生了一些变化。

解决方法很简单:我刚刚添加了

cell.setNeedsDisplay()

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath)

在返回单元格之前。

代码没有其他变化。我注意到在 iOS14 中,单元格的 draw() 没有像在 iOS13.5 中那样被调用。因此添加 setNeedsDisplay() 会强制重绘单元格,这在 iOS13.5 中是在没有新代码行的情况下发生的。

我很想知道是否有人知道任何变化。谢谢

【讨论】:

以上是关于iOS14 中 UICollectionview 的潜在错误的主要内容,如果未能解决你的问题,请参考以下文章

当我在 iOS 14 上的 UITableView 单元格内使用 UICollectionView 时,不会调用 UICollectionView cellForItemAt

iOS 14 UICollectionView新功能之TableView

将最小部署目标升级到 iOS 14 后,UICollectionView 停止显示单元格

使用 iOS 7 的 UICollectionView?边距空间

在 iOS 的 UICollectionview 底部添加按钮

在iOS中选择时增加uicollectionview单元格大小