1

我一直在尝试将我在 Interface Builder 中创建的自定义视图添加到NSStackView,但失败得很惨。

这是我的视图控制器。它目前除了从 NIB 初始化视图之外什么都不做:

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

这是我尝试将新创建的视图添加到堆栈视图的方式(这发生在应用程序委托中):

@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 创建的视图只包含一堆按钮和一个标签:

在此处输入图像描述

PPS:我添加了一个 MWE

4

2 回答 2

1

似乎对该自定义视图没有任何限制以使其大于零大小。您必须确定它的大小行为是什么,例如它是否总是相同的大小,或者以最小值调整大小等。

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

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

于 2016-09-27T02:48:32.763 回答
1

有趣的是,如果我将 ServiceControlViewController 的视图设置为例如 NSButton,那么它会被正确添加并且不会被压缩到零高度。它只发生在我创建的自定义视图中。

正确的。这是因为 NSButton 具有您的自定义 NSView 所没有的东西:一个intrinsicContentSize. 这是堆栈视图用于调整添加视图的大小和位置的方法。

因此,intrinsicContentSize在您的自定义视图中覆盖,一切都会好起来的。

于 2016-09-27T03:19:35.690 回答