如何让 NSCollectionView 项目具有基于文本字段的动态高度

Sim*_*mon 2 macos cocoa

我有一个 NSCollectionView,它显示列表中的项目。

在此输入图像描述

我的布局是由定义的

private func configureCollectionView() {
    let flowLayout = NSCollectionViewFlowLayout()

    flowLayout.itemSize.width = self.view.frame.width
    //flowLayout.itemSize.height = 50
    flowLayout.minimumLineSpacing = 8
    myCollectionView.collectionViewLayout = flowLayout
    view.wantsLayer = true
}
Run Code Online (Sandbox Code Playgroud)

当一段长文本作为项目输入时,我试图获取该“单元格”的项目高度,以随着文本内容而增长/扩展。我已经使用 AutoLayout 设置了约束,并且相当确定它的设置正确,但我的项目高度保持固定为 50(我不知道在哪里设置)。

我正在尝试利用

func collectionView(_ collectionView: NSCollectionView, layout collectionViewLayout: NSCollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> NSSize 
Run Code Online (Sandbox Code Playgroud)

但我对此也没有太多运气,因为我不知道如何最好地确定尺寸应该是多少(在本例中为高度)

对这个问题有什么建议吗?

谢谢!

小智 6

您可以使用sizeThatFits与您想要的宽度和足够大的高度

func collectionView(_ collectionView: NSCollectionView, layout collectionViewLayout: NSCollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> NSSize {

    let string = strings[indexPath.item]
    let size = NSTextField(labelWithString: string).sizeThatFits(NSSize(width: 400, height: 800))

    return NSSize(width: 400, height: size.height > 80 ? size.height : 80)
}
Run Code Online (Sandbox Code Playgroud)