【问题标题】:Autolayout: NSStackView won't resize parent view when height dynamically changed自动布局:当高度动态改变时,NSStackView 不会调整父视图的大小
【发布时间】:2015-11-21 14:36:41
【问题描述】:

类似问题: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 菜单栏中的状态项的视图。该窗口在加载时会根据NSStackView 的内容调整大小,但在内容更改时不会调整大小。

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

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

这里是 NSStackView 的约束:

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

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

更新

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

【问题讨论】:

    标签: objective-c xcode cocoa autolayout nsstackview


    【解决方案1】:

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

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

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

    【讨论】:

    • 你说得对,虚线约束的优先级较低(750)。我正在玩这个,但无论哪个优先级它都不会让步。一般来说,你所描述的将是正确的方法,但在我的情况下,这不起作用。 @Ken Thomases 的回答似乎触及了问题的根源。
    • 啊,很高兴您找到了根本原因。这将属于第三种情况(容器具有防止其增长的自动调整大小的蒙版约束)
    【解决方案2】:

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

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

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

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

    【讨论】:

    • 我对 CCNStatusItem 存储库进行了分叉并进行了以下更改: 1. 在 CCNStatusItemWindow.muserConentView 中添加了 translatesAutoresizingMaskIntoConstraints。 2. 使用代码中的约束将 userContentView 固定到边缘现在效果很好!唯一的遗憾是现在窗口内容被移到了顶部,但这可能是另一个问题。
    • superview 顶部的偏移量是恒定的,所以我可以继续调整 IB 中的 nib。问题解决了,现在一切正常。
    猜你喜欢
    • 2016-12-08
    • 1970-01-01
    • 1970-01-01
    • 2013-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多