NSStackView没有正确布局视图

时间:2014-11-22 20:31:21

标签: objective-c cocoa nsstackview

我刚刚开始尝试NSStackView,我有一个非常有趣的问题,我无法解决。我已经浏览了Apple网站上的自动布局指南以及NSStackView文档,但似乎无法找到任何内容。

我的问题是我有两个相同的NSScrollView个对象(每个对象都嵌入了NSTextView),这些对象是从nib文件加载的。当我将这些视图添加到我的堆栈视图时,首先添加的视图占用可用空间的100%,第二个视图完全折叠到底部,高度为2像素,同时占用所有可用的水平空间。实际上,这看起来像第一个视图是窗口中唯一的视图。这是目前的样子:

A screenshot of the problematic window

由于背景颜色,在此示例中几乎不可能看到,但滚动视图在窗口底部上方的几个像素处结束。这是视图层次结构检查器中的一个更好的视图,我选择了这个2像素的高视图(click here to view larger):

The Xcode view hierarchy inspector

以下是相关的设置代码:

// Load the stack view
self.inputViewController = [[NSViewController alloc] initWithNibName:@"Document_TextInputView" bundle:nil];
self.textView = (NSTextView *)[[(NSScrollView *)self.inputViewController.view contentView] documentView];

self.outputViewController = [[NSViewController alloc] initWithNibName:@"Document_TextOutputView" bundle:nil];
self.outputView = (NSTextView *)[[(NSScrollView *)self.outputViewController.view contentView] documentView];

// Add all views into the stack view
[self.stackView addView:self.inputViewController.view inGravity:NSStackViewGravityTop];
[self.stackView addView:self.outputViewController.view inGravity:NSStackViewGravityBottom];
self.stackView.orientation = NSUserInterfaceLayoutOrientationVertical;

// Load the text into the window.
[self.textView setString:self.cachedText];
[self.outputView setString:@"=== PROGRAM OUTPUT ===\n"];
[self.codeActionSegmentedControl setEnabled:NO forSegment:1];

根据我的理解,内在的内容大小应该禁止视图缩小这么小。我对NSStackView不太熟悉,所以任何帮助都会受到赞赏。

1 个答案:

答案 0 :(得分:3)

好吧,我已经找到了解决我自己问题的方法,而且我发布了这个问题,所以每个搜索此问题并找到问题的人都会得到答案。

问题是NSScrollView没有内在的内容大小,这会禁止NSStackView知道它应该达到什么样的高度,因此第二个NSScrollView正在崩溃。默认情况下在Xcode中创建的约束赋予NSScrollView与其他元素的关系,但是这些信息并不告诉堆栈查看其高度应该是什么。

解决方案是向NSScrollView(以编程方式或在Interface Builder中)添加高度约束,以便NSStackView可以正确布局视图。然后,这一切都神奇地起作用。