我刚刚开始用NSStackView做实验,我遇到了一个我无法解决的有趣的问题。我已经浏览了苹果网站上的自动布局指南和NSStackView文档,似乎找不到任何东西。
我的问题是,我有两个相同的NSScrollView对象(每个对象都带有一个嵌入式NSTextView),它们都是从nib文件中加载的。当我将这些视图添加到堆栈视图中时,首先添加的视图占可用空间的100%,而第二个视图则完全折叠到底部,高度为2个像素,同时占用所有可用的水平空间。实际上,这看起来第一个视图是窗口中唯一的视图。以下是当前的样子:

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

以下是相关的设置代码:
// 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不太熟悉,所以如果能提供任何帮助,我们将不胜感激。
发布于 2014-11-25 21:46:24
好的,我已经找到了我自己的问题的解决方案,我正在张贴它,所以每一个搜索和发现问题的人都会得到答案。
问题是NSScrollView没有一个内在的内容大小,这就禁止了知道它应该是什么高度的NSStackView,因此第二个NSScrollView被折叠了。默认情况下在Xcode中创建的约束给出了NSScrollView与其他元素的关系,但是这些信息并没有告诉堆栈视图它的高度应该是什么。
解决方案是向NSScrollView (以编程方式或在Interface中)添加一个高度约束,以便NSStackView能够正确地布局视图。然后,一切都神奇地起作用了。
https://stackoverflow.com/questions/27082210
复制相似问题