ios-如何将UICollectionView的高度调整为UICollectionView内容大小的高度?

我希望UICollectionView(红色的)缩小到内容大小的高度,在这种情况下,UICollectionViewCells(黄色的)是因为有很多空白空间。 我尝试使用的是:

override func layoutSubviews() {
    super.layoutSubviews()
    if !__CGSizeEqualToSize(bounds.size, self.intrinsicContentSize) {
        self.invalidateIntrinsicContentSize()
    }
}

override var intrinsicContentSize: CGSize {
    return self.collection.contentSize
}

但是return self.collection.contentSize总是返回(width,0)因此,它会缩小到高度30的值(我在XIB文件中为高度设置的值,尽管我的约束> = 30)。

enter image description here

charbinary asked 2020-01-13T21:20:56Z
11个解决方案
117 votes

我建议以下几点:

  1. 向您的集合视图添加高度限制。
  2. 将其优先级设置为999。
  3. 将其常数设置为使其在情节提要板上合理可见的任何值。
  4. 将集合视图的底部相等约束更改为更大或相等。
  5. 将高度约束连接到插座。
  6. 每次在集合视图上重新加载数据时,请执行以下操作:

代码示例:

CGFloat height = myCollectionView.collectionViewLayout.collectionViewContentSize.height
heightConstraint.constant = height
self.view.setNeedsLayout() Or self.view.layoutIfNeeded()

说明:额外,如果您了解它,则不必阅读。 明显!!

用户界面将尝试反映所有约束,无论其优先级如何。 由于高度约束的优先级较低(999),而底部约束的优先级较大或相等。 只要将高度限制常数设置为小于父视图高度的值,则收集视图将等于给定高度,从而实现两个限制。

但是,当高度约束常数设置为大于父视图高度的值时,将无法实现两个约束。 因此,将仅获得具有较高优先级的约束,该约束是更大或相等的底部约束。

以下只是经验的猜测。 因此,它达到一个常数。 但是,它还会尝试使其他未实现的较低优先级约束的结果UI中的错误尽可能地低。 因此,集合视图的高度将等于父视图的大小。

hasan answered 2020-01-13T21:21:55Z
12 votes

最后,我将reloadData子类化,并重写了以下某些方法。

  • intrinsicContentSize返回reloadData可确保始终具有正确的大小
  • 然后只要它可能更改就调用它(例如reloadData

码:

override func reloadData() {
    super.reloadData()
    self.invalidateIntrinsicContentSize()
}

override var intrinsicContentSize: CGSize {
    return self.collectionViewLayout.collectionViewContentSize
}

但请注意,即使显示大数据集,即使屏幕上无法容纳这些数据,也会丢失“单元重用”。

d4Rk answered 2020-01-13T21:22:32Z
10 votes

1)设置您的CollectionView的Fix Height。

2)创建此CollectionView高度常量的出口。    喜欢 :

IBOutlet NSLayoutConstraint * constHeight;

3)在您的.m文件中添加以下方法:

- (void)viewDidLayoutSubviews {
    [super viewDidLayoutSubviews];

    CGFloat height = collectionMenu.collectionViewLayout.collectionViewContentSize.height;
    constHeight.constant = height;
}
Parth Patel answered 2020-01-13T21:23:05Z
8 votes

您必须将高度限制设置为等于内容大小

HeightConstraint.constant = collection.contentSize.height 
Bhanupriya answered 2020-01-13T21:23:25Z
3 votes

做以下。

  1. func resizeCollectionViewSize(){ calendarBaseViewHeight.constant = collectionView.contentSize.height } 的第一设置高度限制
  2. 这里func resizeCollectionViewSize(){ calendarBaseViewHeight.constant = collectionView.contentSize.height } UICollectionView高度可变
  3. 重新加载集合视图后调用该函数

    func resizeCollectionViewSize(){  
           calendarBaseViewHeight.constant = collectionView.contentSize.height      
     }
    
parthiban answered 2020-01-13T21:24:02Z
2 votes

在Swift 5和Xcode 10.2.1中

1)修复CollectionView的高度

2)创建您的CollectionView的出口

IBOutlet weak var myCollectionViewHeight: NSLayoutConstraint!

3)使用以下代码

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    let height = myCollectionView.collectionViewLayout.collectionViewContentSize.height
    myCollectionViewHeight.constant = height
    self.view.layoutIfNeeded()
}
iOS answered 2020-01-13T21:24:35Z
1 votes

首先计算单元格数量,然后将其乘以单元格高度,然后以这种方法返回高度

    collectionView.frame = CGRectMake (x,y,w,collectionView.collectionViewLayout.collectionViewContentSize.height); //objective c
    //[collectionView reloadData];
   collectionView.frame = CGRect(x: 0, y: 0, width: width, height: collectionView.collectionViewLayout.collectionViewContentSize.height) // swift
matloob Hasnain answered 2020-01-13T21:24:55Z
1 votes

d4Rk采取了很棒的解决方案,但在我的情况下,它将继续切断我的收藏视图的底部(太短了)。 我发现这是因为内在内容大小有时为0,这会影响计算。 IDK。 我所知道的就是修复了它。

import UIKit

class SelfSizedCollectionView: UICollectionView {
    override func reloadData() {
        super.reloadData()
        self.invalidateIntrinsicContentSize()
    }

    override var intrinsicContentSize: CGSize {
        let s = self.collectionViewLayout.collectionViewContentSize
        return CGSize(width: max(s.width, 1), height: max(s.height,1))
    }

}
n13 answered 2020-01-13T21:25:16Z
0 votes

DrawerCollectionView上设置约束,例如2701350399247909909、2703350399247909890和Bottom

UICollectionView constraints

如果您更详细地查看我的身高限制,因为它只是为演示图板而设计,所以我没有收到错误,我将其设置为DrawerCollectionView。真实的身高限制在下面的代码中进行设置。

UICollectionView height constraint

我的DrawerCollectionView代码,设置为集合视图Custom Class

UICollectionView custom class

import UIKit

class DrawerCollectionView: UICollectionView {

    override func didMoveToSuperview() {
        super.didMoveToSuperview()

        heightAnchor.constraint(equalToConstant: contentSize.height).isActive = true
    }
}
George_E answered 2020-01-13T21:25:45Z
0 votes

为我工作

    let heightRes = resCollectionView.collectionViewLayout.collectionViewContentSize.height
    foodHeightConstrant.constant = height.advanced(by: 1 )

    foodCollectionView.setNeedsLayout()
    foodCollectionView.layoutIfNeeded()
peyman jani answered 2020-01-13T21:26:04Z
0 votes

获取单元格的高度。 像这样

let cellHeight = cell.frame.height

获取集合视图的原点

let cvOrigin = collectionView.frame.origin

获取集合视图的宽度

let cvWidth = collectionView.bounds.width

设置内容视图的框架

collection.frame = CGRect(x: cvOrigin.x, y: cvOrigin.y, width: cvWidth, height: cellHeight )
aphoe answered 2020-01-13T21:26:37Z
translate from https://stackoverflow.com:/questions/42437966/how-to-adjust-height-of-uicollectionview-to-be-the-height-of-the-content-size-of