如何根据swift

时间:2015-05-26 06:48:33

标签: ios swift uicollectionview

如果有人能在这里点亮一些想法,我真的很感激。我一直试图解决这个问题几个星期(不是开玩笑)。

我有一个“待办事项列表”使用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高度,它会显示正确的值,但是一旦我尝试向下滚动它就会重置回原来的高度。我也试过禁用自动布局,它没有什么区别

3 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分: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)
}

答案 2 :(得分:0)

理论上改变viewDidAppear()中的UI内容是一个很好的做法。但是,此时,您无法确定自动布局是否已在您正在操作的子视图上运行。

您可以通过对其进行子类化并覆盖layoutSubviews()

来检查它何时以及何时可以安全地操作该帧

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