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

问题描述 投票:0回答:4

我正在尝试添加一个小窗口,提供从系统中任何位置到主应用程序的“快速输入”。

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

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

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

我还可以将其设置为带有

NSNonactivatingPanelMask
选项集的 NSPanel。

唯一的问题是:即使用户位于包含全屏应用程序的空间中,如何才能在屏幕上弹出窗口?

我知道当应用程序是

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

macos cocoa nswindow nspanel
4个回答
20
投票

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

  • 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()

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

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()

2
投票

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

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

0
投票

Swift 3.0 版本的你的自我回答

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

0
投票

当我尝试配置以下内容时,出现问题:

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]
  1. 配置的TextFiled对应的contentViewController无法编辑,这是一个非常难的点!
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)
    }
}
  1. contentViewController是直的,我尝试了NSVisualEffectView等修改还是无法修改!
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
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.