UICollectionView 无法提供项目大小

Posted

技术标签:

【中文标题】UICollectionView 无法提供项目大小【英文标题】:UICollectionView fails to provide item size 【发布时间】:2017-12-11 17:38:51 【问题描述】:

我正在为我的应用程序创建一个日历,其中每个月都有一个 UICollectionView 嵌入在 UITableView 的单元格中。 TableView 被固定到屏幕的安全区域,因此它的前后约束从屏幕的左右边缘等于 16。 UICollectionView 固定在表格单元格的 ContentView 上。

CollectionView 中的项目和项目行之间的间距以及部分插入都设置为 0。所以要连续 7 天,我使用itemWidth = tableView.frame.width / 7。然后我在DelegateFlowLayout协议的sizeForItem()方法中将此值设置为宽度和高度。

在运行时,所有值都被正确计算:例如,在 iPhone 8 屏幕上,tableView 宽度为 343,itemWidth 为 49,itemSize 为 (49, 49)。但在屏幕上看起来是这样的:

这是 iPhone SE 的结果:

我尝试以编程方式设置布局间距,但没有帮助。谁能解释我在哪里愚蠢以及屏幕上的 7 个相等的部分如何变成 8 个或 6 个?

更新。我试图从 ViewController 的主视图中计算宽度:itemWidth = (view.frame.width-32) / 7(其中 32 是安全区域插入的总和 - 2*16)。仍然使用零间距,这解决了 8 或 8plus 等较大屏幕的问题,但 SE 仍显示每周 6 天并强制项目之间的间距。至此,我对布局逻辑一无所知!

【问题讨论】:

尝试使用collectionView.frame.width 而不是tableView.frame.width。另外,当您说项目和行之间的间距为 0 时,您是否在 minimumLineSpacingForSectionAtminimumInteritemSpacingForSectionAt 方法中返回 0? 是的,在 IB 和使用这些方法的代码中都设置了 0 间距。我尝试使用 collectionView 宽度 - 结果相同。 在获取集合视图的项目大小后,看起来表格视图/集合视图宽度发生了变化?你能检查一下吗!否则代码应该可以工作。 大小在所有委托方法中都是一致的:sizeForItem(), cellForItemAt(), willDisplayCell()。我还能在哪里检测宽度变化? 分享你的代码。 【参考方案1】:

经过 2 天的研究,我了解到将不同的屏幕宽度除以 7 可能会导致浮点结果不明确。在 SE 的 320 点屏幕上,必须有一个 0.00000001 以某种方式不允许在没有间距的情况下容纳 7 个相同大小的单元格。

所以对我来说,一个解决方法是将生成的 itemWidth 铺在地板上:

itemWidth = CGFloat(floor(Double(view.frame.width-32) / 7))

这会在所有屏幕尺寸上提供可预测的结果 - 现在每周有 7 天。

【讨论】:

以上是关于UICollectionView 无法提供项目大小的主要内容,如果未能解决你的问题,请参考以下文章

UICollectionView:不同大小的项目不计算重复使用的项目

动态调整 UICollectionView 大小以确保没有项目间距

UICollectionView 中具有可变项目大小的恒定行距

UICollectionView:如何在委托方法中设置特定项目后获取项目大小

我在自定义 TableViewCell 中有一个 UICollectionView,但我无法自动调整 CollectionView 的大小

UICollectionView 不同大小的单元格和项目数