当UICollectionView将填充单元格并获得高度快速

问题描述:

我有一个uiCollectionView与一些元素。我需要知道collectionView的高度viewDidAppear做一些魔术。我用下面的代码片段:当UICollectionView将填充单元格并获得高度快速

​​

然而,这仅仅是在viewDidAppearviewWillAppear中viewDidLoad中返回真值人返回0(viewDidAppear之前,我需要)。我需要知道collectionView的生命周期以及元素在哪里填充collectionView以确定它的高度。

如果您想了解UICollectionView的高度,然后使用代码

collectionView.frame.size.height 

如果你想知道那么有多少滚动的高度使用

collectionView.contentSize.height 

UICollectionView的数据源方法被称为就在viewDidLayoutSubviews函数之前。

+0

我使用viewDidLayoutSubviews {print height here}。它再次返回0 –

+0

@AmirShabani你在记录这个collectionViewView.frame.size.height或collectionView.contentSize.height时打印了什么? –

+0

他们都返回0.即使frame.size.height返回零viewDidAppear –

UICollectionView的加载是一个异步过程,因此您不能确定在调用viewDidAppear之前加载完成。

我建议你使用KVO观察你的collectionView的contentSize的值变化,并在值改变时执行你的魔法。

另一种选择从我的POV“脏”的选择是像做

collectionView.reloadData() 
DispatchQueue.main.async{ 
// This will be called when after reloadData() completes 
} 

实现以下UICollectionViewDelegateFlowLayout 方法,使其前返回指定项目的单元格的大小。

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { 
    let height = collectionView.frame.size.height 
    // Your logic 
} 

你怎么能得到的collectionViewcontentSize含有视图(视图控制器的视图)之前被加载?我想你忘了生命周期的观点。

如果您的控制器包含子视图(如collectionView,tableView)。那么首先主父view的被加载(viewDidLoad中viewWillApperviewDidApper)和之后的所有子视图被直接装载在根据图的层次结构。

所以你只能在collectionView完全加载后正确地获得正确的contextSize。如果你在视图加载之前试图访问contentSize,那么它返回的默认值是0.所以如果你想在collectionView上做一些神奇的动画,你可以在初始化时隐藏,并且在完成collectionView加载后取消隐藏并执行动画。