我正在尝试添加一个小窗口,提供从系统中任何位置到主应用程序的“快速输入”。
用户可以按热键,窗口会弹出,并漂浮在所有其他窗口之上。
在大多数情况下,这不是什么大问题。我可以将 NSWindow 配置为:
level = Int(CGWindowLevelKey.TornOffMenuWindowLevelKey.rawValue)
collectionBehavior = .CanJoinAllSpaces
我还可以将其设置为带有
NSNonactivatingPanelMask
选项集的 NSPanel。
唯一的问题是:即使用户位于包含全屏应用程序的空间中,如何才能在屏幕上弹出窗口?
我知道当应用程序是
LSUIElement=true
(在 Dock 中没有位置的应用程序)时这是可能的,但我的不是。
好吧,我的想法是正确的,棘手的部分是所有选项如何相互作用。这是有效的:
[.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()
切换到无边框将阻止用户移动您的窗口。
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()
Swift 4.0 翻译是这样的..我仍在测试这个,但它似乎正在工作。
self.view.window?.level = NSWindow.Level(rawValue: Int(CGWindowLevelForKey(.mainMenuWindow)))
self.view.window?.collectionBehavior = [.canJoinAllSpaces, .fullScreenAuxiliary]
Swift 3.0 版本的你的自我回答是
window.level = Int(CGWindowLevelForKey(.mainMenuWindow))
window.collectionBehavior = [.canJoinAllSpaces, .fullScreenAuxiliary]
当我尝试配置以下内容时,出现问题:
let mouseLocation = NSEvent.mouseLocation
configPanel = NSPanel(contentRect: NSRect(x: mouseLocation.x, y: mouseLocation.y - 600, width: 800, height: 600), styleMask: [.nonactivatingPanel,.borderless], backing: .buffered, defer: false)
configPanel.collectionBehavior = [.canJoinAllSpaces,.fullScreenPrimary]
struct SearchView: View {
@Binding var searchText: String
@Binding var isStared: Bool
var body: some View {
HStack {
TextField("Search", text: $searchText)
.font(.title)
Image(systemName: isStared ? "star.fill" : "star.fill")
.foregroundColor(isStared ? .yellow : .cyan)
.font(.title)
.onTapGesture {
isStared.toggle()
}
}
.padding([.leading,.trailing], 5)
.padding([.top], 3)
}
}
class CustomPanel: NSPanel {
override func awakeFromNib() {
super.awakeFromNib()
// 创建 NSVisualEffectView
let visualEffectView = NSVisualEffectView()
visualEffectView.material = .popover
visualEffectView.blendingMode = .behindWindow
visualEffectView.state = .active
visualEffectView.layer?.cornerRadius = 18
contentView = visualEffectView
}
}