UICollectionView 总是自动调整单元格大小。不使用委托返回的尺寸

Posted

技术标签:

【中文标题】UICollectionView 总是自动调整单元格大小。不使用委托返回的尺寸【英文标题】:UICollectionView always auto sizing cells. Not using sizes returned from delegate 【发布时间】:2019-10-06 23:28:29 【问题描述】:

最近升级到 Xcode 11 / ios13。使用新的视图控制器。 UICollectionView 正在调用我的 sizeForItemAtPath 委托方法,但似乎集合视图总是根据约束选择自我调整大小。但我不想要它!

我尝试将estimatedSize 设置为1x1 只是为了尝试解决这个问题。没用。我已经在所有委托/数据源方法上设置了断点,并且没有看到任何异常。

我也遇到过这个(`systemLayoutSizeFittingSize` not called on iOS 13),也许我的问题与此有关?我可以通过覆盖该链接中的 systemFittingSize 方法来解决问题 - 但我真的不应该这样做。

我发现奇怪的是,任何带有集合视图的现有 xib 都按预期工作 - 唯一的区别似乎是我使用 Xcode 11 VS Xcode 10 创建单元格/集合视图。

我还注意到 Xcode11 中的 UICollectionViewCell 元素包含“内容视图” - 但 Xcode 10 xib 没有内容视图。

还有其他人经历过吗?

【问题讨论】:

【参考方案1】:

界面生成器中有一个估计大小的设置 - 将其设置为无。

更改为无:

【讨论】:

【参考方案2】:

我实际上从未使用过 XIB 或流布局,但我目前正在研究一些自定义集合视图:据我所知,在最普遍的情况下,“选择自我调整大小”的不是集合视图本身,它是布局对象。

自身或其委托的集合视图没有任何方法要求单元格提供其首选大小。另一方面,流布局确实如此。 It is known 流布局在内部检查单元格是否使用自动布局,如果单元格使用自动布局,它会忽略委托提供的信息。

可以通过子类化布局并在 shouldInvalidateLayout(forPreferredLayoutAttributes:, withOriginalAttributes:) 中返回 false 来选择退出该行为。

【讨论】:

以上是关于UICollectionView 总是自动调整单元格大小。不使用委托返回的尺寸的主要内容,如果未能解决你的问题,请参考以下文章

自动调整UICollectionView高度以调整其内容大小

UICollectionView 具有自动调整单元格(estimatedSize)和 sectionHeadersPinToVisibleBounds 的精神

使用自动调整单元格设置UICollectionView后出现异常

自动调整嵌入在 UITableView 中的 UICollectionView 单元格不起作用

调整包含 UICollectionView 的 UITableViewCell

设备旋转时如何自动调整 UICollectionView 的大小?