【问题标题】:When UICollectionView will fill cells and get height in swift当 UICollectionView 将填充单元格并迅速获得高度时
【发布时间】:2017-08-12 11:10:26
【问题描述】:

我有一个带有一些元素的 uiCollectionView。我需要在 viewDidAppear 之前知道 collectionView 的高度来做一些魔术。我使用下面的 sn-p 代码:

collectionView.collectionViewLayout.collectionViewContentSize.height
// or
collectionView.contentSize.height

但是,这仅在 viewDidAppear 和 viewWillAppear 中返回真值,而 viewDidLoad 其他返回 0(在 viewDidAppear 之前我需要它)。我需要了解 collectionView 的生命周期以及元素在 collectionView 中的填充位置以确定它的高度。

【问题讨论】:

    标签: ios swift3 uicollectionview


    【解决方案1】:

    如果您想了解 UICollectionView 的高度,请使用代码

    collectionView.frame.size.height
    

    如果您想知道可滚动高度是多少,请使用

    collectionView.contentSize.height
    

    UICollectionView 的数据源方法在 viewDidLayoutSubviews 函数之前调用。

    【讨论】:

    • 我使用 viewDidLayoutSubviews { print height here }。它再次返回 0
    • @AmirShabani 你在日志中打印了什么这个 collectionView.frame.size.height 或 collectionView.contentSize.height?
    • 两者都返回0。甚至frame.size.height在viewDidAppear中也返回0
    • @AmirShabani 我没有得到零是我得到的值作为collectionView的高度的任何一种情况。故事板中的高度限制值是多少?
    • 我以编程方式添加集合,它的大小是“V:[v0]”,第一次为零。
    【解决方案2】:

    UICollectionView 的加载是一个异步过程,因此在调用 viewDidAppear 之前您无法确定加载是否完成。

    我建议你使用KVO来观察你collectionView的contentSize的值变化,并在值变化时施展你的魔法。

    我的观点中的另一个“脏”选项是做类似的事情

    collectionView.reloadData()
    DispatchQueue.main.async{
    // This will be called when after reloadData() completes
    }
    

    【讨论】:

      【解决方案3】:

      实现如下 UICollectionViewDelegateFlowLayout 在渲染之前返回指定项的单元格大小的方法。

      func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
           let height = collectionView.frame.size.height
           // Your logic
      }
      

      【讨论】:

        【解决方案4】:

        在加载包含视图(ViewController 的视图)之前,如何获取 collectionView 的 contentSize?我想你忘记了生命周期的观点。

        如果您的控制器包含子视图(如 collectionView、tableView)。然后首先加载主父 view(viewDidLoad, viewWillApper 或 viewDidApper),然后根据查看层次结构。

        所以只有在collectionView 完全加载后才能正确获取完整的contextSize。如果您尝试在加载视图之前访问 contentSize,则它返回默认值 0。因此,如果您想在 collectionView 上做一些神奇的动画,您可以在初始化时隐藏,并在加载完成 collectionView 之后取消隐藏并执行动画。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-12-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-02-06
          相关资源
          最近更新 更多