36

我有一个带有分页和所有功能的通用 UICollectionView。

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

使用

self.collectionView.collectionViewLayout.collectionViewContentSize

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

对我来说仍然是个谜。

4

3 回答 3

69

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

我还注意到,有时在调用invalidateLayout我的 UICollectionView 后,我发现它self.collectionView.collectionViewLayout.collectionViewContentSizeself.collectionView.contentSize.

经过大量搜索后,我在这篇 SO 帖子中找到了一个很好的提示

为了使两个 contentSize 计算相同,我需要做的是在调用or[self.collectionView layoutIfNeeded]之后立即调用。[self.collectionView reloadData][self.collectionView.collectionViewLayout invalidateLayout]

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

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

于 2015-08-04T05:52:39.477 回答
2

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

    self.collectionView.layoutIfNeeded()
    DispatchQueue.main.async {
        print(self.collectionView.contentSize) 
    }
于 2020-06-17T11:08:57.120 回答
0

上面的答案是正确的,但是如果您以UICollectionViewController编程方式或使用添加,xib/storyboard我们必须注意scrollDirection. 如果是并且您想跟踪内容,那么您很可能无法获得正确的结果。UICollectionViewFlowLayout()UICollectionViewControllerhorizontalheight

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

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

   self.someProductCollectionViewHeightConstraints?.constant = height
}
于 2020-02-07T11:07:37.277 回答