2

类似的问题:如何根据使用 Autolayout 布局的子视图的大小调整父视图的大小

我有一个 NSStackView 加载DisclosureViewControllers (NSViewController 子类),就像在 Apple Example InfoBarStackView中一样。

Apple 的示例 InfoBarStackView

那些可以扩展和缩回任意高度的视图。我希望包含 的父视图NSStackView根据NSStackView. 在有效的 Apple 示例中。

然而,不幸的是,Apple 正在调整 NSWindow 的大小,而我正在使用CCNStatusItem( CCNStatusItem Github ),这是一个附加到 Apple 菜单栏中状态项的视图。该窗口NSStackView在加载时会根据内容调整大小,但在内容更改时不会调整大小。

加载视图后的 CCNStatusItem 窗口

当我展开一个部分时,内容会溢出并在视图的底部边缘被剪裁。

带有扩展 DisclosureViewController 的 CCNStatusItem 窗口

我经历了所有的限制并试图准确地重现它,但无法让它发挥作用。在 Apple 示例中,他们以编程方式添加所有内容,而我在 Interface Builder 中添加了 NSStackView。

以下是 NSStackView 的约束: 在此处输入图像描述

我的问题是:我在 Interface Builder 中有哪些约束(具有哪些优先级),以便父视图(窗口)根据堆栈视图的内容动态调整大小?我是否必须调用视图的某些方法才能使其工作?

如果我错过了提供一些必要的信息,请告诉我。

更新

接受的答案是正确的方法。这是结果。我的 CCNStatusItem 的分叉版本可以在https://github.com/julianvogels/CCNStatusItem.git找到

滑动现在有效!

4

2 回答 2

2

使用自动布局约束时,不需要调用视图方法来产生这种效果,只需确保:

  • 堆栈视图中的视图具有会导致它们增长的约束
  • 容器对堆栈视图有约束,表明容器应该随堆栈视图一起增长
  • 容器没有任何会阻止它增长的约束

屏幕截图似乎表明它不是第一个 - 视图正在按预期增长。所以它可能是第二个或第三个。界面生成器的屏幕截图似乎显示底部 StackView<>Container 约束是可选的(它是虚线)。根据实际的优先级,这可能是您的问题。根据您描述的设计,应该没有理由不需要该约束。

于 2015-09-07T01:55:55.830 回答
1

问题是它CCNStatusItem不兼容自动布局。它将其窗口的内容视图设置为它自己的视图类之一 ( CCNStatusItemWindowBackgroundView) 的实例。您的视图是该视图的子视图。

当它创建和添加它的视图时,它不会关闭translatesAutoresizingMaskIntoConstraints或使用约束来相对于它的父视图定位它。这基本上意味着它不能被约束强制为不同的大小。

同样,当它将您的视图添加到背景视图时,它不会关闭translatesAutoresizingMaskIntoConstraints您的视图,也不会设置约束以将您的视图与背景视图相关联。

既然你有源,你可以做出这些改变。

于 2015-09-07T02:30:40.313 回答