打开弹出框时,如何防止菜单栏向下移动?

时间:2016-01-21 00:40:08

标签: cocoa fullscreen menubar nspopover

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

任何人都知道有什么方法可以解决这个问题吗?我尝试将一个隐形菜单附加到弹出窗口,但我无法让菜单看不见。

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

enter image description here

4 个答案:

答案 0 :(得分:3)

弹出窗口正在移动,因为其父窗口是状态项窗口,当父窗口移动时,子窗口随之移动。 (在我调查之前,我甚至不知道Cocoa有父窗口和子窗口。)我在显示popover后立即解决了这个代码的问题:

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

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

答案 1 :(得分:1)

使用Carbon events或关注菜单栏(NSStatusBarWindow类型的窗口)发生的事情:

类型

的通知
  • NSWindowDidChangeOcclusionStateNotification
  • NSWindowDidMoveNotification
  • NSWindowWillCloseNotification
  • NSWindowDidCloseNotification

使用类NSStatusBarWindow的对象应该为您提供有关显示或隐藏菜单栏的足够信息,以便添加正确的处理。

答案 2 :(得分:0)

超级hacky方法:

具有一些超高窗口级别的自定义窗口使其显示在菜单栏上,然后根据您的需要在新窗口中添加透明自定义视图,以捕获和处理/阻止鼠标单击。

获取popover用于显示和跟踪/处理NSWindowWillMoveNotification / NSWindowDidMoveNotification的窗口实例。

答案 3 :(得分:0)

我将@ tbodt的答案转换为Swift 4,并确认这是解决了这个问题:

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