如果当前部分单元格高度为零,则不会为后续部分调用索引路径处的行的 Collectionview 单元格
Posted
技术标签:
【中文标题】如果当前部分单元格高度为零,则不会为后续部分调用索引路径处的行的 Collectionview 单元格【英文标题】:Collectionview cell for row at index path not getting called for subsequent sections if the current section cell height is zero 【发布时间】:2019-11-19 10:28:03 【问题描述】:我在我们项目的集合视图中遇到了一个问题 -
Collectionview 由 4 个部分组成。每个部分由 1 个单元格组成。
如果我们将第 0 节中的集合视图单元格的高度保持为零,则不会为第 0 节调用 cellforrrowatindexpath。我们面临的问题是 cellforrowatindexapath 也不会被后续部分调用。尽管提供了其他部分单元格高度,但集合视图不会在屏幕上显示任何内容。
更新:
func numberOfSections(in collectionView: UICollectionView) -> Int
return 3
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int
return 1
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize
Switch indexpath.section
case 0: return CGSize(width: UIScreen.main.bounds.width, height: 0)
case 1: return CGSize(width: UIScreen.main.bounds.width, height: 200)
case 2: return CGSize(width: UIScreen.main.bounds.width, height: 300)
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell
Switch indexpath.section
case 0: return A()
case 1: return B()
case 2: return C()
如果有人对集合视图以这种方式工作的原因有更好的理解,请告诉我。
【问题讨论】:
请编辑您的答案以添加相关的 collectionView 方法。 添加相关方法 你的视图控制器是否符合 UICollectionViewDataSource 和 UICollectionViewDelegateFlowLayout? 【参考方案1】:如果您使用故事板,请尝试在 Size Inspector 部分将 Collection View 的 Estimate Size
更改为 None。
请检查:
【讨论】:
这可能是正确的答案,因为我无法重现问题 - 在我将估计大小更改为无之前,单元格是可见的,然后它们就消失了。以编程方式设置此值时相同:(self.collectionView.collectionViewLayout as? UICollectionViewFlowLayout)?.estimatedItemSize = CGSize(width: 1, height: 1)
成功了,将其设置为 CGSize.zero
使其再次损坏。
Collectionview 估计大小是 none 仅在情节提要中。以编程方式设置 (self.collectionView.collectionViewLayout as?UICollectionViewFlowLayout)?.estimatedItemSize 将使大小根据自动布局约束进行计算。【参考方案2】:
我曾经遇到过类似的问题。它可以通过返回 CGFloat.leastNonzeroMagnitude 或 0.1 而不是 0 来解决。
【讨论】:
我们尝试使用 CGFloat.leastNonzeroMagnitude,不幸的是它不起作用。如果我们返回 0.1 高度,它工作正常。您能否详细说明该集合视图行为背后的原因?【参考方案3】:将此添加到viewDidLoad()
:
if let fl = theCollectionView.collectionViewLayout as? UICollectionViewFlowLayout
fl.estimatedItemSize = CGSize(width: 1, height: 1)
现在将调用 sizeForItemAt
和 cellForItemAt
来获取您的其他部分。
【讨论】:
以上是关于如果当前部分单元格高度为零,则不会为后续部分调用索引路径处的行的 Collectionview 单元格的主要内容,如果未能解决你的问题,请参考以下文章
UICollectionViewCell 的子视图的宽度和高度为零
如果 UIView 动画在单元格上运行,则不会调用 CollectionView didSelectItemAtIndexPath