关闭无边界浮动NSWindow点击外面

时间:2016-01-25 17:21:52

标签: cocoa nswindow

我想在主窗口上方创建一个无边框窗口。主窗口应该是关键窗口(我希望它能够处理键盘和鼠标事件)。此外,浮动窗口应该在用户点击它之外时关闭。基本上,我正在创建一个非常自定义的上下文菜单,就像NSMenu一样。它应该表现得一样。

所以我用这种方式创建了我的窗口:

NSWindow *menuWindow = [NSWindow windowWithContentViewController:menuViewController];

menuWindow.styleMask = NSBorderlessWindowMask;
menuWindow.level = NSFloatingWindowLevel;

[menuWindow makeKeyAndOrderFront:self];

效果很好,但如何处理外部点击以关闭它?窗口不会调用委托的windowDidResignKey,因为它不是关键窗口。如果它确实重载了canBecomeKeyWindow(以便它返回YES),那么浮动窗口会抓取用户输入,这不是我想要的。

那么,有没有办法自动关闭无边框窗口? NSPanel可以提供帮助吗?我尝试使用它,但没有成功(becomeKeyOnlyIfNeeded选择器不能满足我的需要)。

2 个答案:

答案 0 :(得分:4)

要检测窗口外但在您的应用内的点击次数,您可以使用+[NSEvent addLocalMonitorForEventsMatchingMask:handler:]安装事件监视器。如果您还想在用户点击其他应用时关闭该窗口,则可以观看NSApplicationDidResignActiveNotification通知。

答案 1 :(得分:0)

NSWindow具有属性AVCodecContext,应该为您执行此操作。

来自Apple文档:

  

如果从窗口中删除窗口,则此属性的值为true。   当其应用程序被停用时屏幕;如果仍然存在则为假   在屏幕上。 NSWindow的默认值为false;默认值   因为NSPanel是真的。