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

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

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

Есть идеи, как это реализовать?

3 ответа

Решение

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

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

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

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

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

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

Начиная с 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.)

Другие вопросы по тегам