允许 NSWindow (NSPanel) 浮动在全屏应用之上
Allow an NSWindow (NSPanel) to float above full screen apps
我正在尝试添加一点 window,它可以从系统中的任何位置向主应用程序提供 "quick input"。
用户可以按下热键,window 弹出,并浮在所有其他 windows 之上。
在大多数情况下,这不是什么大问题。我可以将 NSWindow 配置为:
level = Int(CGWindowLevelKey.TornOffMenuWindowLevelKey.rawValue)
collectionBehavior = .CanJoinAllSpaces
我还可以将其设为带有 NSNonactivatingPanelMask
选项集的 NSPanel。
唯一的问题是:即使用户在包含全屏的 space 上,我怎样才能使 window 可以在屏幕上弹出应用?
我知道当应用程序是 LSUIElement=true
(在 Dock 中没有位置的应用程序)时这是可能的,但我的不是。
好的,我的想法是正确的,棘手的部分是所有选项如何相互影响。这是有效的:
- 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()
切换到无边框将阻止用户移动您的 window。
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()
的Swift3.0版本是
window.level = Int(CGWindowLevelForKey(.mainMenuWindow))
window.collectionBehavior = [.canJoinAllSpaces, .fullScreenAuxiliary]
Swift 4.0 翻译是这个..我还在测试这个,但它似乎工作。
self.view.window?.level = NSWindow.Level(rawValue: Int(CGWindowLevelForKey(.mainMenuWindow)))
self.view.window?.collectionBehavior = [.canJoinAllSpaces, .fullScreenAuxiliary]
我正在尝试添加一点 window,它可以从系统中的任何位置向主应用程序提供 "quick input"。
用户可以按下热键,window 弹出,并浮在所有其他 windows 之上。
在大多数情况下,这不是什么大问题。我可以将 NSWindow 配置为:
level = Int(CGWindowLevelKey.TornOffMenuWindowLevelKey.rawValue)
collectionBehavior = .CanJoinAllSpaces
我还可以将其设为带有 NSNonactivatingPanelMask
选项集的 NSPanel。
唯一的问题是:即使用户在包含全屏的 space 上,我怎样才能使 window 可以在屏幕上弹出应用?
我知道当应用程序是 LSUIElement=true
(在 Dock 中没有位置的应用程序)时这是可能的,但我的不是。
好的,我的想法是正确的,棘手的部分是所有选项如何相互影响。这是有效的:
- 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()
切换到无边框将阻止用户移动您的 window。
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()
window.level = Int(CGWindowLevelForKey(.mainMenuWindow))
window.collectionBehavior = [.canJoinAllSpaces, .fullScreenAuxiliary]
Swift 4.0 翻译是这个..我还在测试这个,但它似乎工作。
self.view.window?.level = NSWindow.Level(rawValue: Int(CGWindowLevelForKey(.mainMenuWindow)))
self.view.window?.collectionBehavior = [.canJoinAllSpaces, .fullScreenAuxiliary]