如果当前部分单元格高度为零,则不会为后续部分调用索引路径处的行的 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)
    

现在将调用 sizeForItemAtcellForItemAt 来获取您的其他部分。

【讨论】:

以上是关于如果当前部分单元格高度为零,则不会为后续部分调用索引路径处的行的 Collectionview 单元格的主要内容,如果未能解决你的问题,请参考以下文章

使自定义单元格(使用自动布局创建)高度为零

UICollectionViewCell 的子视图的宽度和高度为零

如何增加特定部分中特定单元格的高度

如果 UIView 动画在单元格上运行,则不会调用 CollectionView didSelectItemAtIndexPath

部分滑动单元格后,表格视图单元格高度缩小

如果从 UICollectionView 的其他部分中选择了一个单元格,则取消选择所有其他选择