根据标题内的集合视图动态内容显示集合视图的标题大小不起作用

Posted

技术标签:

【中文标题】根据标题内的集合视图动态内容显示集合视图的标题大小不起作用【英文标题】:Display header size of collectionView based on a collection view dynamic content inside of that header not working 【发布时间】:2018-10-07 21:50:20 【问题描述】:

我有一个collectionView(1),我在上面设置了一个标题。此标头在另一个 collectionView(2) 中。现在我正在尝试根据标题中 collectionView(2) 的大小在 referenceSizeForHeaderInSection 中设置 headerSize。我基本上被卡住了,不知道从哪里开始,我尝试了一切。我能够通过以下方式获得标题高度:

collectionView.collectionViewLayout.collectionViewContentSize.height

但只能在 collectionView(2) 中设置公共变量。尝试获取公共 var 它将在 collectionView(1) referenceSizeForHeaderInSection 中不起作用(仅当我使用无法获取标头返回值的 DispatchQueue 时)。可能我做错了什么。需要帮助,另一个方向,任何它的赞赏。

func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView 

    let header = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: "VideoHeader", for: indexPath)
    header.removeFromSuperview()
    header.backgroundColor = UIColor.white

    headerAdvertCollection.collectionView.translatesAutoresizingMaskIntoConstraints = false
    header.addSubview(headerAdvertCollection.collectionView)
    headerAdvertCollection.collectionView.centerXAnchor.constraint(equalTo: header.centerXAnchor).isActive = true
    headerAdvertCollection.collectionView.centerYAnchor.constraint(equalTo: header.centerYAnchor).isActive = true
    headerAdvertCollection.collectionView.heightAnchor.constraint(equalTo: header.heightAnchor).isActive = true

    headerAdvertCollection.collectionView.widthAnchor.constraint(equalTo: header.widthAnchor, constant: -10).isActive = true

    headerAdvertCollection.setupCollectionView()

    return header


//MARK: Collection View Header Height
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForHeaderInSection section: Int) -> CGSize 

    let advertisingView : CGFloat = 450
    let height : CGFloat = advertisingView

    return CGSize(width: collectionView.frame.width - 10, height: height)

【问题讨论】:

【参考方案1】:

假设您有 collectionView1 和 collectionView2,您可以在委托/数据源方法中访问其中一个,只需执行 if 检查即可。

例如在referenceSizeForHeaderInSection中:

  func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForHeaderInSection section: Int) -> CGSize 

   if collectionView == collectionView1
     let advertisingView : CGFloat = 450
     let height : CGFloat = advertisingView

     //supposing you want to use collectionView2
     return CGSize(width: collectionView2.frame.width - 10, height: height)
   else
     // HERE YOU CAN RETURN A VALUE FOR collectionView2
   

注意:要使用collectionView1和collectionView2,你需要链接outlets

【讨论】:

你好安德鲁。问题是,如果您尝试从 collectionView2 中获取一个值,该值位于 collectionView1 的标头中,该值将为 0。collectionView1 的标头正在加载 collectionView2,这意味着它在我找到高度之前就已加载,所以我不会无法设置。 然后您可以将值保存到类变量中,然后使用该值重新加载集合视图 2 我仍然会对用户看到的第一件事有疑问。在这种情况下,标头不成比例或值为 0 时根本没有标头,直到再次重新加载:)。

以上是关于根据标题内的集合视图动态内容显示集合视图的标题大小不起作用的主要内容,如果未能解决你的问题,请参考以下文章

如何根据其中的内容创建具有动态高度的集合视图?

动态集合视图单元格大小目标c?

如何在可扩展的表格视图单元中制作动态集合视图

为啥集合视图中的动态集合单元格不显示为给定大小并且在 swift 3 中滚动后会发生变化

具有动态高度的集合视图水平方向

集合视图单元格中的动态按钮宽度