Как перетащить NSStatusItems

Вы все знаете панель меню (или лучше сказано NSStatusBar) в Mac OS X.
Есть некоторые предметы, которые я могу перемещать, а другие - нет.

Я хотел бы перетащить NSStatusItem моего приложения.

Любая идея, как реализовать это?

Ответ 1

Несмотря на то, что NSStatusItems появляются рядом с внутренними "дополнительными функциями" Apple, они различны и ведут себя по-разному. Было бы неплохо, если бы Apple объединила элементы, которые могут отображаться в правой части строки меню, но теперь раздел разделяется на отдельные "яблочные внутренние" (справа) и "приложение (NSStatusItem)" слева.

Вы можете визуализировать это различие, поставив компьютер в режим захвата экрана (cmd-shift-4) и нажав пробел, чтобы переключиться на "захват всего окна". Когда вы наводите курсор на значки меню Apple, вы увидите, что все они живут в одном окне. Это объясняет их способность легко управляться и тянуться. Наведение на другие элементы показывает, что каждый NSStatusItem фактически живет в одном отдельном окне (которое, как оказалось, принадлежит приложению, которое его установило).

Лучше всего придерживаться NSStatusItem, даже если вы не можете их перетащить. Это недостаток от Apple, который большинство пользователей поймет, даже если это раздражает. Подчеркивая позитивные компромиссы с предложением более стабильного приложения в долгосрочной перспективе, как правило, смягчаются мнения ваших клиентов (или менеджеров?), Которые настаивают на перетаскивании.

Ответ 2

Вам нужно будет использовать NSMenuExtra, а не NSStatusItem, и сделать пункт меню пучком, запущенным внутри SystemUIServer процесс, а не ваше собственное приложение. Вам также понадобится код, подобный предоставленному MenuCracker, чтобы заставить его работать.

NSMenuExtra недокументирован и не поддерживается, и поэтому считается "взломанным".

Мое предположение о том, что в первую очередь есть два API: дополнительное сбой меню (или утечка памяти) означает весь сбой процесса SystemUIServer или утечку памяти - включая другие сторонние модули, а также системные. С другой стороны, с элементом статуса такая проблема будет влиять только на ваш собственный код.

Ответ 3

По состоянию на 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.)