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

Mar*_*ski 3 macos nsview nswindow swift

我的 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)

}
Run Code Online (Sandbox Code Playgroud)

此外,我尝试创建一个自定义 NSWindowController 并将其设置为界面构建器故事板中主窗口的自定义类。在那里我有以下代码:

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)

}
Run Code Online (Sandbox Code Playgroud)

这也不起作用:/

我什至尝试将设置v.wantsLayer = true作为我在网上找到的建议的答案之一,但是从一开始这似乎很奇怪,当然什么也没做。

我在这里做错了什么?

Mar*_*ski 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)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

v.wantsLayer = true需要声明(当然)是其中I指定的层本身的backgroundColor线之上。

所以是的......这现在有效:

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)
}
Run Code Online (Sandbox Code Playgroud)