UICollectionView动态标头大小计算

时间:2018-12-11 09:25:54

标签: ios swift uicollectionview

我知道有关该主题的文章很多,但是它们以某种方式并没有使我找到解决方案,而在尝试了几天之后,我不知道该怎么办。

所以我有一个UICollectionView,其中有一个标题。对于标题,我创建了自己的UICollectionReusableView。它包含一个带有两个标签的StackView。它们都具有动态大小(线= 0)。这些是StackView的约束(我也尝试将底部约束设置为= 0):

StackView约束

screen shot

我这样计算标头大小...

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForHeaderInSection section: Int) -> CGSize {
    let item = displayItems.object(at: UInt(section)) as! MySectionDisplayItem

    let reusableView: MyReusableView = UIView.fromNib()
    reusableView.setTitle(text: item.getTitle())
        .setSubtitle(subtitle: item.getSubtitle())

    return reusableView.systemLayoutSizeFitting(UILayoutFittingCompressedSize)
}

...并返回要显示的视图,如下所示:

override func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView {
    let item = displayItems.object(at: UInt(indexPath.section)) as! MySectionDisplayItem

    let reusableView = collectionView.dequeueReusableSupplementaryView(ofKind: UICollectionElementKindSectionHeader, withReuseIdentifier: "myReusableView", for: indexPath) as! MyReusableView

    reusableView.setTitle(text: item.getTitle())
        .setSubtitle(subtitle: item.getSubtitle())

    return reusableView
}

在我的UICollectionReusableViewUICollectionView中启用了自动版式。

我尝试过的一些事情:

  • 在标签上将preferredMaxLayoutWidth设置为不同的正值
  • 将标签嵌入单独的视图中
  • 使用约束而不是使用StackView

我希望我不会混淆发现的一些解决方案,但是无论如何,我认为这样的“简单”事情很难实现。

1 个答案:

答案 0 :(得分:0)

我终于通过限制宽度解决了这个问题:

reusableView.translatesAutoresizingMaskIntoConstraints = true
reusableView.widthAnchor.constraint(equalToConstant: UIScreen.main.bounds.width).isActive = true

可能还需要在内容压缩方面发挥作用。