【问题标题】:How to position NSPopover in status bar application (macOS)如何在状态栏应用程序中定位 NSPopover (macOS)
【发布时间】:2021-11-08 00:15:10
【问题描述】:

我已经使用 SwiftUI 创建了一个 macOS 状态栏应用程序,我终于让一切都按照我想要的方式工作了。唯一的问题是,当我在全屏上使用它时,状态栏会隐藏并且弹出菜单会被切掉。有什么想法吗?

MyApp.swift

import SwiftUI

@main
struct MyApp: App {
    @NSApplicationDelegateAdaptor(AppDelegate.self) var delegate;
    var body: some Scene {
        Settings {
            ContentView()
        }
    }
}

class AppDelegate: NSObject,NSApplicationDelegate {
    var statusItem: NSStatusItem!
    var popOver: NSPopover!
    
    func applicationDidFinishLaunching(_ notification: Notification){
        let contentView = ContentView()
        let popOver = NSPopover();
        popOver.behavior = .transient
        popOver.animates = true
        popOver.contentViewController = NSHostingController(rootView: contentView)
        popOver.setValue(true, forKeyPath: "shouldHideAnchor")
        
        self.popOver = popOver
        self.statusItem = NSStatusBar.system.statusItem(withLength: CGFloat(NSStatusItem.variableLength))
        
        if let MenuButton = self.statusItem.button {
            MenuButton.image = NSImage(systemSymbolName: "display.2", accessibilityDescription: nil)
            MenuButton.action = #selector(MenuButtonToggle)
        }
    }
    
    @objc func MenuButtonToggle(_ sender: AnyObject){
        if let button = self.statusItem.button {
            if self.popOver.isShown{
                self.popOver.performClose(sender)
            }else {
                self.popOver.show(relativeTo: button.bounds, of: button, preferredEdge: NSRectEdge.minY)
                self.popOver.contentViewController?.view.window?.makeKey()
            }
        }
    }
}

【问题讨论】:

  • “当我在全屏上使用它时,状态栏会隐藏,弹出菜单会被切掉”你显示每组屏幕截图,但你没有解释那里发生了什么。哪个是你的状态栏按钮?

标签: macos swiftui popover


【解决方案1】:

在您的代码中,只需添加比弹出框本身更大的“随机”尺寸。

我认为这是因为弹出框的大小不是立即计算的,所以那里存在竞争条件,但这对我来说似乎工作得很好?

popOver.contentSize = NSSize(width: 600, height: 1)

【讨论】:

    猜你喜欢
    • 2011-11-21
    • 2011-12-11
    • 2012-02-21
    • 2020-06-05
    • 2016-10-17
    • 2011-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多