在运行时设置UICollectionViewCellSize

时间:2016-09-29 21:06:45

标签: ios swift autolayout uicollectionview uicollectionviewlayout

我有一个包含三个UICollectionViews的堆栈视图,设置为每个都等于垂直空间。该堆栈视图设置为显示器一半的高度,因此它在较大的设备上使用更多空间。这已在Interface Builder中设置。

因此,我需要在运行时设置UICollectionView的单元格大小,因为在我们运行之前,我不知道单元格的实际大小。我希望它们是方形的,所以我只想考虑UICollectionView的高度,减去顶部和底部的插图,并将itemSize设置为结果大小。

我尝试在viewDidLayoutSubviews中执行此操作,因为那时我认为已经设置了集合视图的初始高度。但是,它们似乎设置为1000x1000(即使它们在故事板中的大小更合理),因此我根据集合视图高度1000计算单元格大小。这太大了,但我认为我和#39;再次被召唤并再次获得重新计算机会。我这样做,但在UICollectionView大声抱怨itemSize不正确之前(即太大而不适合collectionView,现在有了#34;正确"}大小。)

在没有来自UICollectionView的警告的情况下,找到我正在寻找的行为的最佳方法是什么?在运行时根据UICollectionView的最终大小设置集合视图项目大小是我过去一直在努力解决的问题,并且似乎永远不会出现"对"是时候设置itemSize了。我不想动态地返回它,只是因为它不是在程序的生命周期中发生变化的东西。在最初布置视图时似乎会出现一些不一致的情况。

我认为集合视图的初始大小为1000.0×1000.0似乎很奇怪,但我不确定如何或为什么要修复它 - 也许它与嵌入到堆栈中有关查看?

编辑添加:几乎可以肯定UIStackView导致布局问题。我创建了一个虚拟项目来测试UICollectionView的大小,当它是UIStackView中嵌入的顶级视图时。如果未嵌入,则在调用viewDidLayoutSubviews时,其大小已正确以适合其superview的边界。但是,如果它位于UIStackView内,则它将保持默认大小1000x1000。

目前,我正在通过在viewDidLayoutSubviews中添加以下代码解决此问题:

    if collectionView.bounds.size.width > view.bounds.size.width {
        view.layoutIfNeeded()
    }

collectionView位于UIStackView内,viewUIViewController的主视图。这允许基于视图大小的所有后续计算都是正确的,并且如果UIStackView行为得到修复,则希望不会被调用。

类似的讨论herehere。有趣的是,在XCode8中,新的默认设置是不保存XIB文件中的视图大小,而是将所有内容放入初始大小为1000x1000,以便在第一次布局过程中解析。我估计除了UIStackView以外。

1 个答案:

答案 0 :(得分:0)

您有sizeForItemAtIndexPath()返回itemSize吗?我发现实现该函数是在运行时动态调整UICollectionViewCell的唯一可靠方法。