以编程方式将InterfaceBuilder创建的视图添加到NSStackView,将它们压缩到0高度

时间:2016-09-25 20:25:52

标签: swift cocoa interface-builder nsstackview

我一直在尝试将我在Interface Builder中创建的自定义视图添加到NSStackView,但实际上却失败了。

这是我的视图控制器。它目前只能从NIB初始化视图:

class ServiceControlViewController : NSViewController {
    init() {
        super.init(nibName: "ServiceControlView", bundle: nil)!
    }
}

以下是我试图将新创建的视图添加到堆栈视图(这在app委托中发生):

@IBOutlet weak var stackView: NSStackView!

@IBAction func addButtonClicked(sender: AnyObject) {
    let viewController = ServiceControlViewController()
    stackView.addView(viewController.view, in: .top)
    stackView.layoutSubtreeIfNeeded()
}

当我将创建的视图的帧添加到堆栈视图之前打印它时,它具有正确的大小。如果我之后打印它,它被压扁到零高度。我怀疑有一些我不理解的自动调整大小的魔法,但我无法修复它。

有趣的是,如果我将ServiceControlViewController的视图设置为例如是一个NSButton,然后它被正确添加,而不是压扁到零高度。它只发生在我创建的Custom Views

PS:我的InterfaceBuilder创建的视图只包含一堆按钮和一个标签:

enter image description here

PPS:我添加了an MWE

2 个答案:

答案 0 :(得分:1)

似乎对该自定义视图没有约束使其大于零大小。 您必须确定其尺寸行为是什么,例如它是否总是相同的大小,或最小的可调整大小等。

然后在IB中,您可以构建创建该效果所需的约束。例如。: sample constraints

或者,您可以将这些控件放入堆栈视图中以获得类似的结果。

答案 1 :(得分:1)

  

有趣的是,如果我将ServiceControlViewController的视图设置为例如是一个NSButton,然后它被正确添加,而不是压扁到零高度。它只发生在我创建的自定义视图中。

正确。这是因为NSButton有自定义NSView没有的东西:intrinsicContentSize。这是堆栈视图用于调整和定位添加的视图的内容。

因此,在自定义视图中覆盖intrinsicContentSize,一切都会很好。