当我的弹出窗口打开时,如何防止菜单栏向下移动?

How do I prevent the menu bar from moving down when my popover is open?

我有一个带有弹出窗口的应用程序,该弹出窗口出现在状态栏项目上。问题是,当您在全屏应用程序中单击图标时,然后将鼠标从菜单栏移​​开以单击弹出窗口中的某些内容,菜单栏会向上移动,弹出窗口也会向上移动。很烦人。

有人知道解决这个问题的方法吗?我试过将一个不可见的菜单附加到弹出窗口,但我无法使菜单不可见。

为清楚起见,截屏,烦人的部分是我挥动鼠标的地方:

Super-hacky 方法:

自定义 window 具有一些 super-high window 级别,使其显示在菜单栏上方,然后将透明自定义视图添加到新的 window 以捕获和handles/blocks根据需要点击鼠标

或:

获取弹出窗口用于显示的 window 实例和 track/handle NSWindowWillMoveNotification / NSWindowDidMoveNotification.

弹出窗口window正在移动,因为它的parentwindow是状态项window,当parentwindow移动时, child 随之移动。 (在我调查这个之前,我什至不知道 Cocoa 有 parent 和 child windows。)我在显示弹出窗口后立即用这段代码解决了这个问题:

NSWindow *popoverWindow = self.popup.contentViewController.view.window;
[popoverWindow.parentWindow removeChildWindow:popoverWindow];

现在,菜单栏仍然向上移动,但至少弹出窗口保持在原位。

使用 Carbon events 或观察菜单栏发生的事情(window 类型 NSStatusBarWindow):

通知类型

  • NSWindowDidChangeOcclusionStateNotification
  • NSWindowDidMoveNotification
  • NSWindowWillCloseNotification
  • NSWindowDidCloseNotification

对象 class NSStatusBarWindow 应该会为您提供有关菜单栏显示或隐藏的足够信息,以便添加适当的处理。

我将@tbodt 的回答转换为 Swift 4 并确认可以解决此问题:

let popoverWindow = popup.contentViewController.view.window as? NSWindow
popoverWindow?.parent?.removeChildWindow(popoverWindow!)