NSCollectionView使用自动布局自动调整子视图

时间:2014-01-08 15:29:44

标签: objective-c cocoa autolayout nscollectionview

我正在尝试实现简单NSView的堆叠排列,为此我使用绑定到字典控制器的NSCollectionView。我到目前为止的结果如下:

Normal

左侧的标签绑定到控制器项目键,SegmentedControl selectedIndex绑定到项目值。

问题是,我不知道如何强制NSCollectionView中的子视图符合容器宽度;会发生什么,他们保持自己的宽度,当NSCollectionView变得太窄时,出现水平滚动条,如下所示:

enter image description here

我知道this question(以及“反向”,this one),而且我从来没有在Autolayout上做过太多事情而不是琐碎的事情。我想知道,凭借AutoLayout带来的所有功能,有没有办法解决这个问题,而无需使用编码和使用事件/通知? (我知道观察NSViewFrameDidChangeNotification是另一种选择,对吗?)

由于

2 个答案:

答案 0 :(得分:1)

只是做了一些非常相似的事情 - 除了使用NSSplitView子类 - 所以如果我正确理解你的问题,你想要设置子视图的约束以附加到你的超级视图的两侧,如下所示:

NSDictionary * viewsDict = NSDictionaryOfVariableBindings(filler);
[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[filler]|"
                                                             options:0
                                                             metrics:nil
                                                               views:viewsDict]];

您可能还需要调整子视图的内容压缩阻力优先级参数,以获得所需的结果。

另请注意,在专门针对OS X 10.9时,会出现新的NSStackView类:

NSStackView是OS X 10.9中的一个新类。它用于使用自动布局布局水平或垂直视图堆栈。当从堆栈视图添加和删除视图时,将自动创建和修改必要的约束保持一致的布局。

答案 1 :(得分:1)

解决方案实际上非常简单:切换到基于视图的NSTableViewNSCollectionView不适用于问题中描述的用途。使用NSTableView,您可以默认免费获得调整大小的行为。

无论您使用Bindings还是数据源,它都有效,但它并不重要。