【问题标题】:Why does my NSWindow not float above full screen apps when created programmatically? (Swift 5)为什么我的 NSWindow 在以编程方式创建时不会浮在全屏应用程序之上? (斯威夫特 5)
【发布时间】:2020-03-15 00:14:00
【问题描述】:

我正在尝试创建一个 NSWindow 并使窗口浮动在全屏应用程序上方。我已经尝试过使用下面概述的两种不同方法。

方法 1 - 故事板(工作)

我有一个包含窗口控制器的情节提要的项目。此窗口控制器在身份检查器中分配了以下类。

class WindowController: NSWindowController {

    override func windowDidLoad() {
        super.windowDidLoad()
        guard let window = self.window else { return }

        // Enable full screen
        window.backgroundColor = .red
        window.level = NSWindow.Level(rawValue: Int(CGWindowLevelForKey(.mainMenuWindow)))
        window.styleMask = [.fullScreen]
        window.collectionBehavior = [.canJoinAllSpaces, .fullScreenAuxiliary]
    }

}

此方法没有任何问题,如screenshot 所示。但是,我更愿意以编程方式创建 NSWindow。

方法 2 - 以编程方式(不起作用)

在这种方法中,我有以下 WindowController 类:

class WindowController: NSWindowController {

    init() {
        super.init(window: NSWindow())
        guard let window = self.window else { return }
        setup(window: window)
    }

    func setup(window: NSWindow) {
        window.backgroundColor = .red
        window.level = NSWindow.Level(rawValue: Int(CGWindowLevelForKey(.mainMenuWindow)))
        window.styleMask = [.fullScreen]
        window.collectionBehavior = [.canJoinAllSpaces, .fullScreenAuxiliary]
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }
}

连同我的 appDelegate 中的以下内容:

@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate {

    let window = WindowController()

    func applicationDidFinishLaunching(_ aNotification: Notification) {
        window.showWindow(self)
    }

}

尽管这成功地创建了一个浮动在窗口应用程序上方的 NSWindow,如 here 所见,但 NSWindow 拒绝浮动在全屏应用程序上方。

从我尝试调试问题开始,似乎window.collectionBehavior = [.canJoinAllSpaces, .fullScreenAuxiliary] 在第二种方法中以编程方式创建 NSWindow 时没有做任何事情。

我对 swift 还很陌生,因此对于第二种方法中为什么 NSWindow 没有浮动在全屏应用程序上方的任何帮助将不胜感激!

版本:

  • 斯威夫特 5

  • Xcode 11.2.1

【问题讨论】:

  • @LeoDabus 我已经尝试在 windowDidAppear、windowDidLoad 甚至在 IBAction 中设置我的窗口级别,这对全屏完全没有影响。我也使用过 window?.level = .floating 。显然,您链接的问题并不相关,尤其是因为我的问题仅适用于以编程方式创建 NSWindow 而不是使用情节提要的情况。我肯定遗漏了一些东西,但我相信这不是你所链接的。
  • 这只是为了让你知道正确的语法如何
  • 我认为自 High Sierra 以来您不能在全屏以上设置窗口(包括屏幕保护程序以上)
  • @LeoDabus 在简单地评论链接之前添加一些上下文可能是明智的......关于高山脉的假设是不正确的,因为我已经有一个窗口浮动在全屏之上在我当前工作Catalina 上的应用程序,只是不完全以编程方式,这是我想做的。

标签: swift xcode macos nswindow swift5


【解决方案1】:

7 个月后,我设法通过将窗口的 styleMask 更改为无边框来让它工作

window.styleMask = [.borderless]

迟到比我想象的要好......

【讨论】:

    猜你喜欢
    • 2017-08-30
    • 1970-01-01
    • 2016-07-12
    • 1970-01-01
    • 2019-01-24
    • 1970-01-01
    • 1970-01-01
    • 2016-05-24
    • 2016-02-09
    相关资源
    最近更新 更多