我一直在尝试将我在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创建的视图只包含一堆按钮和一个标签:
答案 0 :(得分:1)
似乎对该自定义视图没有约束使其大于零大小。 您必须确定其尺寸行为是什么,例如它是否总是相同的大小,或最小的可调整大小等。
或者,您可以将这些控件放入堆栈视图中以获得类似的结果。
答案 1 :(得分:1)
有趣的是,如果我将ServiceControlViewController的视图设置为例如是一个NSButton,然后它被正确添加,而不是压扁到零高度。它只发生在我创建的自定义视图中。
正确。这是因为NSButton有自定义NSView没有的东西:intrinsicContentSize
。这是堆栈视图用于调整和定位添加的视图的内容。
因此,在自定义视图中覆盖intrinsicContentSize
,一切都会很好。