如何以编程方式将视图添加到NSWindow(或NSView)?

4

我在我的ViewController中有这段代码。然而,我以编程方式添加的视图无处可见。

override func viewDidLoad() {
    super.viewDidLoad()

    let f: NSRect = NSMakeRect(0, 0, 200, 200)
    let v: NSView = NSView(frame: f)
    v.layer?.backgroundColor = NSColor.yellowColor().CGColor
    self.view.addSubview(v)

}

此外,我尝试创建一个自定义的NSWindowController,并将其设置为接口构建器Storyboard中我的主窗口的自定义类。在那里,我有以下代码:
override func windowDidLoad() {
    super.windowDidLoad()

    let f: NSRect = NSMakeRect(0, 0, 200, 200)
    let v: NSView = NSView(frame: f)
    v.layer?.backgroundColor = NSColor.yellowColor().CGColor
    self.window?.contentView?.addSubview(v)

}

这也不起作用 :/
我甚至尝试设置 v.wantsLayer = true,因为我在网上找到的一个答案建议这样做,但从一开始就感觉很奇怪,当然没有任何作用。
我在这里错了什么?

你需要设置 v.wantsLayer = true - Leo Dabus
我尝试在viewDidLoad()windowDidLoad()方法调用中再次使用v.wantsLayer = true,但两个视图仍然不可见。我甚至尝试了一些疯狂的事情,比如将contentView的层颜色设置为clearColor,以为所有视图都添加在它下面。我甚至做到了self.window?.contentView?.addSubview(v, positioned: NSWindowOrderingMode.Above, relativeTo: self.window?.contentView)... 仍然没有结果。视图仍然无处可见。 - Martin Velchevski
1个回答

7

由于我已经考虑了所有可能的情况,而罪魁祸首最终是wantsLayer,因此我来回答自己的问题。

起初我做了以下操作:

override func windowDidLoad() {
    super.windowDidLoad()

    let f: NSRect = NSMakeRect(32, 32, 200, 200)
    let v: NSView = NSView(frame: f)
    v.layer?.backgroundColor = NSColor.greenColor().CGColor
    v.wantsLayer = true
    self.window?.contentView?.addSubview(v)

    if let views = self.window?.contentView?.subviews {
        for v in views {
            print(v.frame)
        }
    }
}

我看到视图已经被添加到contentView中,但它是不可见的。我在意识到自己的错误之前做了很多事情,这个错误是:

v.wantsLayer = true声明需要(当然)在我指定图层背景颜色的那一行之前。

所以...现在它就可以正常工作了:

override func windowDidLoad() {
    super.windowDidLoad()
    let f: NSRect = NSMakeRect(32, 32, 200, 200)
    let v: NSView = NSView(frame: f)
    v.wantsLayer = true
    v.layer?.backgroundColor = NSColor.greenColor().CGColor
    self.window?.contentView?.addSubview(v)
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接