我有一个故事板,由一个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
之前的高度一样。
我该怎么做?
答案 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
。
补充说明:
配置集合视图单元格,您可以在func configure(someData: SomeData)
上创建一个帮助函数FooCollectionViewCell
,以便代码可以在cellForItemAt
函数和{{1}之间共享功能。
sizeForItemAt
对于这两行代码,似乎只有在// Configure the data for your `FooCollectionViewCell`
cell.stackView.addArrangedSubview(/*view1*/)
cell.stackView.addArrangedSubview(/*view2*/)
包含垂直UICollectionViewCell
作为subViews时才需要它(可能是来自Apple的错误)。
UIStackView