如何拖动NSStatusItems

时间:2009-03-08 16:43:56

标签: cocoa drag-and-drop nsstatusbar

你们都知道Mac OS X中的菜单栏(或更好的说NSStatusBar) 我可以移动一些物品而不移动其他物品。

我希望能够拖动我的应用程序的NSStatusItem。

知道如何实现这个吗?

3 个答案:

答案 0 :(得分:19)

虽然NSStatusItems出现在Apple的内部“菜单附加功能”附近,但它们是截然不同的,并且表现不同。如果Apple统一了可以出现在菜单栏右侧区域的项目,那将是很好的,但是现在该部分被拆分为不同的“apple internal”(右侧)和“app-provided(NSStatusItem)” “在左边。

您可以通过将计算机置于屏幕捕获模式(cmd-shift-4)并按空格键切换到“捕获整个窗口”来显示区别。当您将鼠标悬停在Apple的菜单图标上时,您会看到它们都位于一个窗口中。这解释了他们易于管理和拖拽的能力。将鼠标悬停在其他项目上会显示每个NSStatusItem实际上都位于其自己的单个窗口中(恰好由安装它的应用程序拥有)。

最好坚持使用NSStatusItem,即使你无法拖动它们。这是Apple的一个缺点,大多数用户都会理解,即使它很烦人。强调长期提供更稳定的应用程序的积极权衡通常会削弱正在推动可拖动性的客户(或经理?)的意见。

答案 1 :(得分:14)

您必须使用NSMenuExtra,而不是NSStatusItem,并使菜单项成为在SystemUIServer进程内运行的捆绑包,而不是您自己的应用。您还需要像MenuCracker提供的代码才能使其正常工作。

NSMenuExtra没有记录且不受支持,因此被视为“黑客”。

我猜测首先有两个API:菜单额外崩溃(或内存泄漏)意味着整个SystemUIServer进程崩溃或内存泄漏 - 包括其他第三方模块以及系统提供的模块。另一方面,对于状态项,这样的问题只会影响您自己的代码。

答案 2 :(得分:0)

截至macOS Sierra 10.12 http://www.macworld.co.uk/how-to/mac-software/7-sierra-menu-bar-tips-how-use-mac-menu-bar-in-macos-sierra-3649163/

  

第三方应用有时会安装为菜单附加功能,菜单栏中存在控件,或者可以重新启动为无面应用,尽管最初并非如此。从macOS Sierra开始,这些菜单附加功能可以像原生菜单一样重新排列。 (OS X El Capitan的情况并非如此。)