首次加载时UICollectionView错误的contentSize,之后更正

时间:2013-08-16 07:07:25

标签: objective-c uicollectionview uicollectionviewlayout

我有一个带分页的常见UICollectionView和所有。

仍然试图找出viewDidLoad:,viewWillAppear:和viewDidAppear:上的原因,仅在第一次视图调用时,调用myCollectionView.collectionView.contentSize.width时出现错误的大小。它始终以0宽度响应(高度总是正确的)。连续重新加载视图让我得到了正确的答案。

使用

self.collectionView.collectionViewLayout.collectionViewContentSize

在第一次加载时给我正确的宽度事件。

对我来说还是一个谜。

3 个答案:

答案 0 :(得分:48)

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

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

经过多次搜索,我找到了一个很好的提示here in this SO post

要使两个contentSize计算相同,我需要做的是在致电[self.collectionView layoutIfNeeded][self.collectionView reloadData]后立即致电[self.collectionView.collectionViewLayout invalidateLayout]

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

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

以上答案是正确的,但是如果您以编程方式或通过UICollectionViewController添加xib/storyboard,则必须注意scrollDirection中的UICollectionViewFlowLayout() {1}}。如果它是UICollectionViewController,并且您要跟踪内容horizontal,则很可能无法获得正确的结果。

就我而言,我使用了以下代码。

height