NSStackView将NSView放在基线上

时间:2015-03-28 20:46:30

标签: cocoa nsview nsviewcontroller nslayoutmanager nsstackview

回顾了Apple关于NSStackView的大部分(缺乏)文档,加上更大的互联网的明智之词,包括Stackoverflow的集体智慧,问题仍然存在。

任何NSView我以编程方式添加到我的(IB实例化)NSStackView,在视觉上将它们自己定位到各自的重力区域的底部。因此,它们彼此重叠,并且不像具有适当间距的预期“堆叠”视图那样。

每个重力区域都以某种方式压缩,无法容纳更多视图。我将NSStackView.addView应用于重力区域越多,现有视图就越细。

我希望NSStackView能够自然地扩展以适应嵌入视图的.size。

任何明智的律师都非常感激......

---更多细节 -

我使用界面构建器将StackView放入主窗口。然后,我可以在界面构建器中将其他视图添加到堆栈区域,例如按钮。这些堆栈和布局在IB和运行时是预期的。

但是,当我以编程方式向任何重力区域添加或插入任何视图时,它们的下边缘垂直向下定位到StackView的下边缘。垂直或水平堆栈的布局行为相同。

因此,如果我以编程方式添加多个视图,则它们的大小正常并显示但重叠。我使用'NSBox'对象作为视图(现在),并使用'.sizeToFit()'来调整它们的大小。我可以看到他们的'.bounds.height'和'width'都不为零。

我不确定如何设置或记录内在内容大小。这可能是接下来要尝试的事情。

- 没有运气 -

所以,我现在已经严格地完成了所有排列:压缩,拥抱,(非零)内在大小调整,约束,没有约束和各种类型的NSView,但是......如果我'.addView(... )'或'.insertView(...)'不止一次,在任何'NSStackView'重力区域中,后续视图覆盖先前的视图并将其自身定位在特定基线上。这是离办公室地板最近的边缘,无论堆叠方向如何。

非常感谢任何'NSStackView'和AutoLayout帮助,无论是情感的还是技术的。

1 个答案:

答案 0 :(得分:2)

所以看起来NSStackView的所有问题都来自于它的约束。您必须以正确的形式为子视图提供约束。最简单的方法是在stackview的每个子视图中放置一个具有实体约束的对象/视图。

在Interface Builder中,当我在NSView中放置一个带有大小,宽度和前导约束的简单NSImageView时,它将成为Stackview的子视图,堆栈显示正确。

但是,如果我的NSStackView中只有空的NSView,即使是样式化和分配的帧,NSView也不会显示,或者所有视图都会堆叠在基线上。

此NSView不会显示在NSStackView中: Unconstrained NSView

此NSView将显示在NSStackView中: Constrained NSView