当UICollectionView将填充单元格并获得高度快速
我有一个uiCollectionView与一些元素。我需要知道collectionView的高度viewDidAppear做一些魔术。我用下面的代码片段:当UICollectionView将填充单元格并获得高度快速
然而,这仅仅是在viewDidAppear和viewWillAppear中和viewDidLoad中返回真值人返回0(viewDidAppear之前,我需要)。我需要知道collectionView的生命周期以及元素在哪里填充collectionView以确定它的高度。
如果您想了解UICollectionView的高度,然后使用代码
collectionView.frame.size.height
如果你想知道那么有多少滚动的高度使用
collectionView.contentSize.height
UICollectionView的数据源方法被称为就在viewDidLayoutSubviews函数之前。
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
}
你怎么能得到的collectionView
contentSize
含有视图(视图控制器的视图)之前被加载?我想你忘了生命周期的观点。
如果您的控制器包含子视图(如collectionView,tableView)。那么首先主父view
的被加载(viewDidLoad中,viewWillApper或viewDidApper)和之后的所有子视图被直接装载在根据图的层次结构。
所以你只能在collectionView完全加载后正确地获得正确的contextSize。如果你在视图加载之前试图访问contentSize,那么它返回的默认值是0.所以如果你想在collectionView上做一些神奇的动画,你可以在初始化时隐藏,并且在完成collectionView
加载后取消隐藏并执行动画。
我使用viewDidLayoutSubviews {print height here}。它再次返回0 –
@AmirShabani你在记录这个collectionViewView.frame.size.height或collectionView.contentSize.height时打印了什么? –
他们都返回0.即使frame.size.height返回零viewDidAppear –