我有一个带有弹出框的应用程序,它出现在状态栏项目上。问题是,当您在全屏应用程序中单击图标时,然后将鼠标从菜单栏移开以单击弹出窗口中的某些内容,菜单栏向上移动,弹出窗口也是如此。这很烦人。
任何人都知道有什么方法可以解决这个问题吗?我尝试将一个隐形菜单附加到弹出窗口,但我无法让菜单看不见。
屏幕截图为清晰起见,烦人的部分是我挥动鼠标的地方:
答案 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!)