【问题标题】:NSPopover not aligned to NSStatusItem menubar iconNSPopover 未与 NSStatusItem 菜单栏图标对齐
【发布时间】:2022-11-10 17:08:03
【问题描述】:

我正在尝试为 macOS 12 制作一个菜单栏应用程序,当单击菜单栏图标时会显示一个弹出窗口。正如您从随附的屏幕截图中看到的那样,我显示了弹出框,但它实际上并未与菜单栏图标对齐。以下是相关代码:

class AppDelegate: NSObject, NSApplicationDelegate {
    var popover: NSPopover!
    var statusBarItem: NSStatusItem!

    func applicationDidFinishLaunching(_ aNotification: Notification) {
        // Create the SwiftUI view that provides the window contents.
        let contentView = ContentView()

        // Create the status item
        statusBarItem = NSStatusBar.system.statusItem(withLength: CGFloat(NSStatusItem.variableLength))

        // Create the popover
        let popover = NSPopover()
        popover.behavior = .transient
        popover.contentViewController = NSHostingController(rootView: contentView)
        self.popover = popover

        if let button = statusBarItem.button {
            button.image = NSImage(systemSymbolName: "eyes", accessibilityDescription: "Eyes")
            button.action = #selector(togglePopover(_:))
        }
    }

    @objc func togglePopover(_ sender: AnyObject?) {
        guard let button = statusBarItem.button else { return }

        if popover.isShown {
            popover.performClose(sender)
        } else {
            popover.show(relativeTo: button.bounds, of: button, preferredEdge: .maxY)
        }
    }
}

【问题讨论】:

  • 试试preferredEdge:.minY

标签: swift macos swiftui appkit nspopover


【解决方案1】:

您可以将contentSize 分配给与contentView 大小相同的弹出框:

popover.contentViewController = NSHostingController(rootView: contentView)
popover.contentSize = NSSize(width: popoverWidth, height: popoverHeight)

内容视图:

struct ContentView: View {
  var body: some View {    
    VStack {
      Text("Hello World")
    }
    .frame(width: viewWidth, height: viewHeight)
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多