允许NSWindow(NSPanel)浮动在全屏应用之上

时间:2016-03-24 16:57:32

标签: macos cocoa nswindow nspanel

我试图添加一个提供"快速输入的小窗口"从系统中的任何地方到主应用程序。

用户可以点击热键,窗口弹出,并漂浮在所有其他窗口之上。

在大多数情况下,这不是一个大问题。我可以将NSWindow配置为:

level = Int(CGWindowLevelKey.TornOffMenuWindowLevelKey.rawValue)
collectionBehavior = .CanJoinAllSpaces

我也可以将其设置为NSNonactivatingPanelMask选项的NSPanel。

唯一的问题是:即使用户位于包含全屏应用的空间,我怎样才能使窗口弹出窗口?

我知道当应用为LSUIElement=true(在Dock中没有位置的应用)时,这是可能的,但我的不是。

3 个答案:

答案 0 :(得分:5)

好吧,我有正确的想法,棘手的部分是所有选项如何相互作用。这有什么作用:

  • NSPanel, NSWindow
  • 样式面具:[.borderless, .nonactivatingPanel]

这些属性:

panel.level = .mainMenu
panel.collectionBehavior = [.canJoinAllSpaces, .fullScreenAuxiliary]

Swift 4.2代码

使用这些设置创建并显示面板。然后,您可以将面板拖动到全屏应用程序(双显示器设置)。

let panel2 = NSPanel(contentRect: NSRect(x: 0, y: 0, width: 200, height: 200), styleMask: [.titled, .nonactivatingPanel], backing: .buffered, defer: true)
panel2.level = .mainMenu
panel2.collectionBehavior = [.canJoinAllSpaces, .fullScreenAuxiliary]
panel2.orderFrontRegardless()

Floating NSPanel above fullscreen macOS app

切换到无边框将阻止用户移动窗口。

let panel2 = NSPanel(contentRect: NSRect(x: 0, y: 0, width: 200, height: 200), styleMask: [.borderless, .nonactivatingPanel], backing: .buffered, defer: true)
panel2.level = .mainMenu
panel2.collectionBehavior = [.canJoinAllSpaces, .fullScreenAuxiliary]
panel2.orderFrontRegardless()

答案 1 :(得分:1)

Swift 4.0的翻译是这样的......我还在测试它,但它似乎正在工作。

self.view.window?.level = NSWindow.Level(rawValue: Int(CGWindowLevelForKey(.mainMenuWindow)))
self.view.window?.collectionBehavior = [.canJoinAllSpaces, .fullScreenAuxiliary]

答案 2 :(得分:0)

your self-answer的Swift 3.0版本

window.level = Int(CGWindowLevelForKey(.mainMenuWindow))
window.collectionBehavior = [.canJoinAllSpaces, .fullScreenAuxiliary]