3

我有一个故事板,由一个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它像以前一样需要高度。

我应该怎么做?

4

2 回答 2

2

您需要计算内容的大小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
}

有了这个,你将有一个动态的 cell heights UICollectionView


进一步说明:

  1. 对于集合视图单元格的配置,您可以创建一个辅助函数func configure(someData: SomeData)FooCollectionViewCell以便在cellForItemAt函数和sizeForItemAt函数之间共享代码。

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

    // Layout the collection view cell
    cell.setNeedsLayout()
    cell.layoutSubviews()
    
于 2017-10-29T20:29:57.237 回答
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 来选择部分。希望这可以帮助。

于 2015-12-12T04:15:53.620 回答