NSStackView没有正确布局视图

问题描述:

我刚刚开始尝试使用NSStackView,我遇到了一个我无法解决的非常有趣的问题。我浏览了Apple网站上的自动版面设计指南以及NSStackView文档,似乎找不到任何东西。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,所以任何帮助,将不胜感激。

+0

您是否尝试对子视图使用'NSStackViewGravityTop'? – Astoria 2014-11-22 22:03:44

+0

@Astoria是的,这与我发布的内容没有任何明显不同。 – SevenBits 2014-11-22 22:09:05

好吧,我找到了解决我自己的问题,我发布它,所以每个人谁搜索这个,并找到问题将有答案。

问题是NSScrollView没有固有内容大小,禁止了知道它应该是什么高度的NSStackView,因此第二个NSScrollView被折叠。在Xcode中默认创建的约束给NSScrollView与其他元素的关系,但是这个信息并不告诉堆栈视图什么高度应该是什么。

解决方法是将高度约束添加到NSScrollView(以编程方式或在Interface Builder中),以便NSStackView可以正确布置视图。然后,这一切都只是神奇的作品。