【发布时间】:2016-02-01 07:38:35
【问题描述】:
AppKit Release Notes for OS X v10.11 建议可以根据每个项目调整集合视图项目的大小:
可以为 CollectionView 的所有项目全局确定项目大小(通过设置 NSCollectionViewFlowLayout 的“itemSize”属性),或者可以从一个项目更改为下一个项目(通过在 CollectionView 的委托上实现 -collectionView:layout:sizeForItemAtIndexPath: )。
在我的例子中,我的 CollectionViewItem 由一个标签组成,其中包含一个不同长度的字符串。我使用 NSCollectionView 来显示字符串数组,因为 NSStackViews 不支持数组绑定,并且不流向新行。字符串数组通过数组控制器绑定到 NSCollectionView 的内容。
我的项目的 nib 文件设置正确,根视图和标签的 Content Hugging 和 Content Compression Resistance 优先级均为 1000,并且边缘通过以下方式对齐自动布局。
现在,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 以尊重我的项目的 AutoLayout 约束并为每个单元格动态使用计算的大小?
【问题讨论】:
-
我的快速想法是不会使用
itemAtIndexPath获取该项目。而是从模型中获取内容并计算高度。 -
该项目尚未在集合视图中,这就是您返回
nil的原因。集合视图在将其添加到视图之前会询问您的大小。 -
很好的解释,但是您将如何处理执行 AutoLayout 约束的实际问题?
-
我也对此感兴趣,但还没有正确的答案。但我认为 AutoLayout 总是自上而下工作,并且框架由集合视图设置,独立于任何 AL。所有的拥抱等只会影响项目框架内的视图。项目框架本身由 CollectionViewLayout(或您正在使用的委托方法)单独定义。也许人们可以仅仅为了调整大小而分配一个自己的额外项目,应用模型(设置表示的对象),获取大小并返回它?
标签: macos cocoa autolayout nscollectionview nscollectionviewitem