Objective c UICollectionView首次加载时内容大小错误,请在加载后更正

Objective c UICollectionView首次加载时内容大小错误,请在加载后更正,objective-c,uicollectionview,uicollectionviewlayout,Objective C,Uicollectionview,Uicollectionviewlayout,我有一个通用的UICollectionView,包括分页和所有功能 仍在试图弄清楚为什么在viewDidLoad:、ViewWillAspect:和ViewDidAspect:,仅在第一次调用视图时,我在调用myCollectionView.collectionView.contentSize.width时得到了错误的大小。它总是以0宽度响应(高度总是正确的)。连续重新加载视图,得到正确的视图 求助于使用 self.collectionView.collectionViewLayout.coll

我有一个通用的UICollectionView,包括分页和所有功能

仍在试图弄清楚为什么在viewDidLoad:、ViewWillAspect:和ViewDidAspect:,仅在第一次调用视图时,我在调用myCollectionView.collectionView.contentSize.width时得到了错误的大小。它总是以0宽度响应(高度总是正确的)。连续重新加载视图,得到正确的视图

求助于使用

self.collectionView.collectionViewLayout.collectionViewContentSize
这给了我第一次加载时的正确宽度事件


对我来说仍然是个谜。

所以我看到了一个类似的问题,contentSize宽度总是为零。简单的答案是…collectionView中可能还没有内容。这就是为什么它的内容大小为零

我还注意到,有时在我的UICollectionView上调用
invalidateLayout
后,我发现
self.collectionView.collectionViewLayout.collectionViewContentSize
self.collectionView.contentSize
不同

经过多次搜索,我发现了一个很好的提示

我需要做的是在调用
[self.collectionView reloadData]
[self.collectionView.collectionViewLayout]之后立即调用
[self.collectionView layout]
,以使两个contentSize计算结果相同

这本质上迫使重新加载立即发生,而不是在下一个运行循环中


我真的希望这能解决您的问题。

上述答案是正确的,但如果您以编程方式或使用
xib/storyboard
添加
UICollectionViewController
,我们必须注意
UICollectionViewFlowLayout()的
scrollDirection
用于
UICollectionViewController
。如果它是水平的,并且您想要跟踪内容的高度,那么您很有可能得不到正确的结果

在我的例子中,我使用了下面的代码

self.someCollectionViewController?.collectionView.reloadData()
self.someCollectionViewController?.collectionView.layoutIfNeeded()
if let height = self.someCollectionViewController?.collectionViewLayout.collectionViewContentSize.height {

   self.someProductCollectionViewHeightConstraints?.constant = height
}

就我而言,我的内容大小总是为零。layoutIfNeeded()对我来说不够,我必须在DispatchQueue.main.async ie中获取内容大小

    self.collectionView.layoutIfNeeded()
    DispatchQueue.main.async {
        print(self.collectionView.contentSize) 
    }

我肯定这和自动布局有关。。试着禁用itAlready disabled,这也是我想到的第一件事。似乎加载视图的速度不够快,因为在重新显示时宽度是正确的(例如,当返回到同一视图时)。您是否找到过这个问题的答案?这里也是同样的问题。有什么评论吗?还没有,还没有在新版iOS上试用过。你救了我的命我非常感谢你@ucangetitI发现我的collectionView.contentSize.height大于
contentOffset.y
的最大结果,即使使用
[self.collectionView LayoutFneed]
。这对我不起作用。我使用的是
layout.estimatedItemSize=CGSize(宽度:1,高度:1)
,即使在调用self.collectionView之后,它也会返回1,1。layoutIfNeeded@osrl确保将
estimatedItemSize
设置为接近单元格的实际大小。此属性只是系统调整单元格大小的起点,如果您的单元格大小完全不同,那么最好从最小单元格IMHO的大小开始。