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

时间:2015-08-27 09:27:20

标签: objective-c xcode cocoa autolayout nsstackview

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

我有一个NSStackView加载DisclosureViewController s(NSViewController子类),就像在Apple示例中InfoBarStackView一样。

Apple's example InfoBarStackView

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

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

CCNStatusItem window after loading the view

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

CCNStatusItem window with extended DisclosureViewController

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

以下是NSStackView的约束: enter image description here

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

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

更新

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

找到我的分叉版本的CCNStatusItem

Sliding now works!

2 个答案:

答案 0 :(得分:1)

使用自动布局约束时,您无需调用视图方法来产生此效果,但只需确保:

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

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

答案 1 :(得分:0)

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

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

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

由于您已获得源代码,因此可以进行更改。