【问题标题】:UICollectionView wrong contentSize on first load, correct after that首次加载时 UICollectionView 错误的 contentSize,之后更正
【发布时间】:2013-08-16 07:07:24
【问题描述】:

我有一个通用的 UICollectionView 和分页。

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

求助于

self.collectionView.collectionViewLayout.collectionViewContentSize

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

对我来说仍然是个谜。

【问题讨论】:

  • 我确定这与自动布局有关.. 尝试禁用它
  • 已经禁用,我也是第一个想到的。看起来它加载视图的速度不够快,因为重新出现时宽度是正确的(例如,当回到同一个视图时)。
  • 你找到这个问题的答案了吗?
  • 这里有同样的问题。有没有cmets?
  • 尚未,尚未在较新版本的 iOS 上试用。

标签: objective-c uicollectionview uicollectionviewlayout


【解决方案1】:

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

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

经过大量搜索,我发现了一个很好的提示here in this SO post

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

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

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

【讨论】:

  • 你救了我的命。 :D 非常感谢。 @ucangetit
  • 我发现我的 collectionView.contentSize.height 大于contentOffset.y 的最大结果,即使是[self.collectionView layoutIfNeeded]
  • 这对我不起作用。我正在使用layout.estimatedItemSize = CGSize(width: 1, height: 1),即使在调用 self.collectionView.layoutIfNeeded 之后它也会返回 1, 1
  • @osrl 确保将estimatedItemSize 设置为接近单元格的实际大小。此属性只是系统调整单元格大小的起点,如果您的单元格大小差异很大,那么最好从最小单元格的大小开始恕我直言。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    上面的答案是正确的,但是如果您以编程方式或使用xib/storyboard 添加UICollectionViewController,我们必须注意UICollectionViewFlowLayout()scrollDirectionUICollectionViewController。如果是horizontal,并且您要跟踪内容height,那么您很可能不会得到正确的结果。

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

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

    【讨论】:

      猜你喜欢
      • 2017-01-27
      • 1970-01-01
      • 1970-01-01
      • 2018-05-18
      • 1970-01-01
      • 1970-01-01
      • 2015-12-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多