我刚刚开始尝试使用NSStackView
,但遇到了一个非常有趣的问题,无法解决。我已经在Apple网站和NSStackView
文档上搜索了自动布局指南,但似乎找不到任何东西。
我的问题是我有两个相同的NSScrollView
对象(每个对象都有一个嵌入式NSTextView
),这些对象是从nib文件加载的。当我将这些视图添加到堆栈视图时,第一个添加的视图将占用100%的可用空间,第二个添加的视图将完全塌陷到底部,高度为2像素,同时占用所有可用的水平空间。实际上,这看起来像第一个视图是窗口中的唯一视图。这是当前的样子:
由于背景色,在此示例中几乎看不到,但是滚动视图在窗口底部上方几个像素处结束。这是来自视图层次结构检查器的更好视图,在这里我选择了此2像素高视图(click here to view larger):
这是相关的设置代码:
// 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
不太熟悉,因此不胜感激。 最佳答案
好了,我已经找到了解决我自己问题的方法,并且将其发布,以便每个搜索此方法并找到问题的人都将得到答案。
问题是NSScrollView
没有固有的内容大小,这阻止了NSStackView
知道应该达到的高度,因此第二个NSScrollView
被折叠了。默认情况下,在Xcode中创建的约束给出NSScrollView
与其他元素的关系,但是此信息不会告诉堆栈视图有关其高度的任何信息。
解决方案是向NSScrollView
添加高度限制(以编程方式或在Interface Builder中),以使NSStackView
可以正确放置视图。然后,这一切都神奇地起作用了。