Autolayout:当高度动态改变时,NSStackView 不会调整父视图的大小

Autolayout: NSStackView won't resize parent view when height dynamically changed

类似问题:How to resize a parent view based on the size of subviews layouted with Autolayout

我得到了一个 NSStackView,它加载 DisclosureViewControllers(NSViewController 子类)就像在 Apple 示例中一样 InfoBarStackView

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

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

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

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

NSStackView 的约束如下:

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

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

更新

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

找到

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

  • 堆栈视图中的视图具有会导致它们增长的约束
  • 容器对堆栈视图有限制,指示容器应随堆栈视图一起增长
  • 容器没有任何会阻止其增长的约束

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

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

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

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

既然您已经获得源代码,就可以进行这些更改。