如何使用 NSPopover 制作菜单栏应用程序?

发布于 2024-12-10 17:53:31 字数 139 浏览 0 评论 0原文

我见过很多带有菜单栏项的应用程序或仅带有菜单栏界面的应用程序。

互联网上有一些教程和资料向您展示如何实现这一目标。但问题是,它们中只有可点击的索引行。

我希望当您单击菜单栏图标/项目时出现 NSPopover。有谁知道怎么做这个吗?

I have seen a lot of applications with a Menubar Item or applications with only a Menubar interface.

There are some tutorials and stuff on the internet showing you how to accomplish that. But the thing is, those do only have clickable index rows in them.

I would want to have a NSPopover appear when you click the Menubar Icon / Item. Anybody who knows how to make this?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

幸福%小乖 2024-12-17 17:53:31

我不知道是否可以使用标准状态栏项目来完成。使用菜单的自定义视图相对容易。

使用自定义视图创建状态栏项目:

item = [[NSStatusBar systemStatusBar] statusItemWithLength:thickness];
view = [[CustomView alloc] initWithFrame:(NSRect){.size={thickness, thickness}}];
[item setView:view];        

您的自定义视图需要检测鼠标单击:

- (void)mouseDown:(NSEvent *)event {
   ...
}

最后,在检测到鼠标单击后的某个时刻,显示/隐藏弹出窗口。

if (/* menulet is active */) {
    [popover showRelativeToRect:/* menulet view frame */
                         ofView:/* menulet view */
                  preferredEdge:NSMinYEdge];
} else {
    [popover performClose:nil];
}

您需要一些 NSWindow swizzling 来获取文本字段在弹出框内工作。

我已经准备了一个最小的 Xcode 项目,其中包含这些想法和一些粘合剂:PopoverMenulet

I don't know if it can be done with a standard status bar item. Using a custom view for the menulet it's relatively easy.

Create a status bar item with a custom view:

item = [[NSStatusBar systemStatusBar] statusItemWithLength:thickness];
view = [[CustomView alloc] initWithFrame:(NSRect){.size={thickness, thickness}}];
[item setView:view];        

Your custom view needs to detect mouse clicks:

- (void)mouseDown:(NSEvent *)event {
   ...
}

And finally, at some point after detecting the mouse click, show/hide the popover.

if (/* menulet is active */) {
    [popover showRelativeToRect:/* menulet view frame */
                         ofView:/* menulet view */
                  preferredEdge:NSMinYEdge];
} else {
    [popover performClose:nil];
}

You need a bit of NSWindow swizzling to get text fields working inside the popover.

I've prepared a minimal Xcode project with these ideas and some glue: PopoverMenulet.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文