4

我有一个堆栈视图,其中包含三个UICollectionViews,这些视图被设置为赋予它们每个相等的垂直空间。该堆栈视图设置为显示器一半的高度,以便在较大的设备上使用更多空间。这已经在Interface Builder中设置。在运行时设置UICollectionViewCellSize

所以,我需要在运行时设置UICollectionView的单元大小,因为直到我们运行时,我不知道单元格的实际大小是多少。我希望它们是方形的,所以我只想考虑UICollectionView的高度,减去顶部和底部部分的插图,并将itemSize设置为最终的尺寸。

我试图在viewDidLayoutSubviews中做到这一点,因为那时我认为已经设置了集合视图的初始高度。但是,它们似乎设置为1000x1000(即使它在故事板中的尺寸更合理),因此我根据1000的集合视图高度计算单元尺寸。这太大了,但我认为我我们会再次打电话,并有机会重新计算它。而我呢,但UICollectionView之前没有抱怨大声的itemSize是不正确的(即过大,以适应collectionView,现在有“正确”的大小。)

什么是让行为我的最佳方式寻找没有来自UICollectionView的警告?根据UICollectionView的最终尺寸在运行时设置集合视图项目大小是我过去一直在努力的事情,似乎从未有过设置itemSize的“正确”时间。我不想动态地返回它,如果仅仅是因为它在程序的生命期间没有改变。刚开始布置视图时,似乎存在一些不一致之处。

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

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

现在,我解决这个问题viewDidLayoutSubviews工作中加入以下代码:

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

collectionViewUIStackViewview里面是UIViewController的主视图。这允许所有基于视图大小的后续计算都是正确的,并且如果UIStackView行为得到解决,希望不会被调用。

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

回答

0

您是否有sizeForItemAtIndexPath()退货itemSize?我发现实现该功能是在运行时动态调整UICollectionViewCell的唯一可靠方法。