OS X v10.11 AppKit 发行说明 https://developer.apple.com/library/mac/releasenotes/AppKit/RN-AppKit/#10_11CollectionView建议可以根据每个项目调整集合视图项目的大小:
项目大小可以全局确定 CollectionView 的所有项目(通过设置 NSCollectionViewFlowLayout 的“itemSize”属性),或者可以从一个项目到下一个项目不同(通过在 CollectionView 的委托上实现 -collectionView:layout:sizeForItemAtIndexPath: )。
就我而言,我的 CollectionViewItem 由单个标签组成,其中包含不同长度的字符串。我使用 NSCollectionView 来显示字符串数组,因为 NSStackViews 不支持数组绑定,并且不流向新行。字符串数组通过数组控制器绑定到 NSCollectionView 的内容。
我的项目的 nib 文件已正确设置,根视图和标签都有内容拥抱 and 内容抗压缩性优先级为 1000,边缘通过 AutoLayout 对齐。
现在, NSCollectionViewLayout 的委托方法具有以下签名:
func collectionView(collectionView: NSCollectionView,
layout collectionViewLayout: NSCollectionViewLayout,
sizeForItemAtIndexPath indexPath: NSIndexPath) -> NSSize
我现在的想法是抓取项目本身,对其运行布局传递,然后返回新的项目大小。
let item = collectionView.itemAtIndexPath(indexPath)!
item.view.layout()
return item.view.bounds.size
这种方法的问题是 itemAtIndexPath 返回 nil。如果我在 nil 情况下返回默认大小,则该默认大小将用于所有单元格。
如何设置 NSCollectionView 以尊重我的项目的自动布局约束,并为每个单元格动态使用计算的大小?