我刚刚开始尝试使用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可以正确放置视图。然后,这一切都神奇地起作用了。

10-08 09:37
查看更多