如何根据swift中的行数调整UICollectionView contentSize.height

Posted

技术标签:

【中文标题】如何根据swift中的行数调整UICollectionView contentSize.height【英文标题】:How to adjust UICollectionView contentSize.height based on number of rows in swift 【发布时间】:2015-05-26 06:48:33 【问题描述】:

如果有人可以在这里提出一些想法,我将不胜感激。几周以来我一直在努力解决这个问题(不是开玩笑)。

我有一个使用 collectionView 的“待办事项列表”,我在其中隐藏已完成的行并将它们移动到列表的末尾。然后,如果需要,我可以使用按钮取消隐藏项目。 collectionView 看起来与 tableView 完全一样,每行一个项目(单元格)。

当项目被隐藏时,collectionView 在底部有很多空的滚动空间,而不是自动删除隐藏行使用的空间,因为它们在技术上仍然存在。

我正在尝试削减该空白空间,以便 collectionView 高度等于可见的单元格/行数。

override func viewDidAppear(animated: Bool) 

if isCellHidden  //checking if cells are hidden 
var heightOfSection0 = 95 + (42 * self.collectionView.numberOfItemsInSection(0))
println(self.collectionView.contentSize.heigh) //returns 2350
self.collectionView.contentSize.height = CGFloat(heightOfSection0)
println(heightOfSection0) //returns 1019
println(self.collectionView.contentSize.heigh) //returns 1019.0 which is correct but as soon as I scroll down it resets to it's original size (2350) and let's me scroll through that empty space...

如果我在设置后立即尝试读取 collectionView 高度,它会显示正确的值,但一旦我尝试向下滚动,它就会重置回原来的高度。我也试过禁用自动布局,它没有任何区别

【问题讨论】:

尝试在sizeForItemAtIndexPath中调整大小 【参考方案1】:

您不应该直接管理contentSize - 而是从collectionView(_:numberOfItemsInSection:) 返回要显示的适当数量的项目(即不计算您的“隐藏”单元格)。

【讨论】:

嗯,这是一个非常简单/好主意,但在单元格隐藏期间我仍在使用 numberOfItemsInSection(0),如果我只返回可见的,那么我无法获得正确的行数。我之前有一个 tableView,设置 contentSize 不是问题,它可以正常工作.... 你是如何使用它的?它应该返回在任何给定时间要显示的项目数。管理contentSize 在某些情况下可能会起作用,但它会变得不必要地复杂,并且可能会导致意外行为(如您的情况)。 我有一个标签,显示已完成项目的数量和一些其他滚动功能以及基于已完成或仍然可见的项目数量的计算,但我想我可以直接从数据源访问它们,而不是collectionView,让我检查一下..【参考方案2】:

您可以使用sizeForItemAtIndexPath: 更改集合视图单元格的大小。

func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize 
    var numberOfCellInRow : Int = 3
    var padding : Int = 5
    var collectionCellWidth : CGFloat = (self.view.frame.size.width/CGFloat(numberOfCellInRow)) - CGFloat(padding)
    return CGSize(width: collectionCellWidth , height: collectionCellWidth)

【讨论】:

我觉得这是在 collectionView 上进行自定义/可变大小调整的合适位置 是的,这是一个可以改变大小的地方@donnywals【参考方案3】:

理论上,在viewDidAppear() 中更改 UI 内容是一个不错的选择。但是,此时,您不能确定自动布局是否已在您正在操作的子视图上操作。

您可以通过子类化并覆盖layoutSubviews()来检查它何时具有以及何时可以安全地操作框架。

我在这里遇到了类似的问题:https://***.com/a/30446125/4396258

【讨论】:

以上是关于如何根据swift中的行数调整UICollectionView contentSize.height的主要内容,如果未能解决你的问题,请参考以下文章

Swift Eureka forms:如何限制多值部分中的行数?

根据包含的文本设置 UILabel 的行数 - Objective C 和/或 Swift

是否可以根据屏幕宽度使用gridLayoutManager调整recyclerview的行数和列数?

部分错误Swift中的行数

Swift 3 部分中的行数无效

winform datagridview如何根据内容的行数自动改变高度