UICollectionView:使用UIStackView的动态单元格高度

时间:2015-11-27 22:13:37

标签: ios swift uicollectionview uistackview

我有一个故事板,由一个UICollectionView组成,其中包含多个不同高度的单元格。第一个单元格取自UICollectionViewDelegateFlowLayout

的高度
func collectionView(collectionView: UICollectionView,
        layout collectionViewLayout: UICollectionViewLayout,
        sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize

..但我希望第二个细胞更短。 我在单元格内的“主”UIStackViews内放了两个UIStackView,内部UIStackViews中的每一个都有一个或多个标签,如下所示:

cell
--> stackView (master)
    --> stackView (1)
        --> label
    --> stackView (2)
        --> label
        --> label (etc)

..希望UIStackView能使细胞高度动态,但事实并非如此。它与UICollectionViewDelegateFlowLayout之前的高度一样。

我该怎么做?

2 个答案:

答案 0 :(得分:1)

如果您想要更改单元格的高度,则必须更改sizeForItemAtIndexPath中返回的高度。堆栈视图在这里不会有任何影响。以下是您可以做的一个示例:

func collectionView(collectionView: UICollectionView,
    layout collectionViewLayout: UICollectionViewLayout,
    sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize {

    if indexPath.row == 1 {
        return CGSizeMake(width, height/2)
    }
    return  CGSizeMake(width, height)
}

这将更改第1行的单元格大小。您还可以使用indexPath.section选择节。希望这会有所帮助。

答案 1 :(得分:1)

您需要计算CollectionViewCell的内容大小并将其返回到sizeForItemAt函数。

func collectionView(_ collectionView: UICollectionView,
                    layout collectionViewLayout: UICollectionViewLayout,
                    sizeForItemAt indexPath: IndexPath) -> CGSize {

    // Create an instance of the `FooCollectionViewCell`, either from nib file or from code.
    // Here we assume `FooCollectionViewCell` is created from a FooCollectionViewCell.xib
    let cell: FooCollectionViewCell = UINib(nibName: "FooCollectionViewCell", bundle: nil)
        .instantiate(withOwner: nil, options: nil)
        .first as! FooCollectionViewCell

    // Configure the data for your `FooCollectionViewCell`
    cell.stackView.addArrangedSubview(/*view1*/)
    cell.stackView.addArrangedSubview(/*view2*/)

    // Layout the collection view cell
    cell.setNeedsLayout()
    cell.layoutSubviews()

    // Calculate the height of the collection view based on the content
    let size = cell.contentView.systemLayoutSizeFitting(
        CGSize(width: collectionView.bounds.width, height: 0),
        withHorizontalFittingPriority: UILayoutPriorityRequired,
        verticalFittingPriority: UILayoutPriorityFittingSizeLevel)

    return size
}

这样,您将拥有动态单元格高度UICollectionView

补充说明:

  1. 配置集合视图单元格,您可以在func configure(someData: SomeData)上创建一个帮助函数FooCollectionViewCell,以便代码可以在cellForItemAt函数和{{1}之间共享功能。

    sizeForItemAt
  2. 对于这两行代码,似乎只有在// Configure the data for your `FooCollectionViewCell` cell.stackView.addArrangedSubview(/*view1*/) cell.stackView.addArrangedSubview(/*view2*/) 包含垂直UICollectionViewCell作为subViews时才需要它(可能是来自Apple的错误)。

    UIStackView