单击外部关闭无边界浮动 NSWindow
Close borderless floating NSWindow on click outside
我想创建一个无边框 window 浮动在主 window 上方。 mainwindow应该是keywindow(我想让它处理键盘鼠标事件)。此外,浮动 window 应该在用户点击它的外部时关闭。基本上,我正在创建一个非常自定义的上下文菜单,就像 NSMenu 一样。它应该表现得一样。
所以我这样创建了 window:
NSWindow *menuWindow = [NSWindow windowWithContentViewController:menuViewController];
menuWindow.styleMask = NSBorderlessWindowMask;
menuWindow.level = NSFloatingWindowLevel;
[menuWindow makeKeyAndOrderFront:self];
效果很好,但我如何处理外部点击以关闭它? window 不会调用委托的 windowDidResignKey,因为它不是密钥 window。如果它确实重载了 canBecomeKeyWindow(所以它 returns 是),那么浮动 window 会获取用户输入,这不是我想要的。
那么,有什么办法可以自动关闭无边框window? NSPanel 有帮助吗?我尝试使用它,但没有成功(becomesKeyOnlyIfNeeded 选择器没有满足我的需要)。
要检测 window 之外但在您的应用内的点击,您可以使用 +[NSEvent addLocalMonitorForEventsMatchingMask:handler:]
安装事件监视器。如果您还想在用户单击其他应用程序时关闭 window,您可以观察 NSApplicationDidResignActiveNotification
通知。
NSWindow 有一个 属性 hidesOnDeactivate
应该可以为您完成此操作。
来自 Apple 文档:
The value of this property is true if the window is removed from the
screen when its application is deactivated; false if it remains
onscreen. The default value for NSWindow is false; the default value
for NSPanel is true.
我想创建一个无边框 window 浮动在主 window 上方。 mainwindow应该是keywindow(我想让它处理键盘鼠标事件)。此外,浮动 window 应该在用户点击它的外部时关闭。基本上,我正在创建一个非常自定义的上下文菜单,就像 NSMenu 一样。它应该表现得一样。
所以我这样创建了 window:
NSWindow *menuWindow = [NSWindow windowWithContentViewController:menuViewController];
menuWindow.styleMask = NSBorderlessWindowMask;
menuWindow.level = NSFloatingWindowLevel;
[menuWindow makeKeyAndOrderFront:self];
效果很好,但我如何处理外部点击以关闭它? window 不会调用委托的 windowDidResignKey,因为它不是密钥 window。如果它确实重载了 canBecomeKeyWindow(所以它 returns 是),那么浮动 window 会获取用户输入,这不是我想要的。
那么,有什么办法可以自动关闭无边框window? NSPanel 有帮助吗?我尝试使用它,但没有成功(becomesKeyOnlyIfNeeded 选择器没有满足我的需要)。
要检测 window 之外但在您的应用内的点击,您可以使用 +[NSEvent addLocalMonitorForEventsMatchingMask:handler:]
安装事件监视器。如果您还想在用户单击其他应用程序时关闭 window,您可以观察 NSApplicationDidResignActiveNotification
通知。
NSWindow 有一个 属性 hidesOnDeactivate
应该可以为您完成此操作。
来自 Apple 文档:
The value of this property is true if the window is removed from the screen when its application is deactivated; false if it remains onscreen. The default value for NSWindow is false; the default value for NSPanel is true.