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

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

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

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


person papr    schedule 08.03.2009    source источник


Ответы (3)


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

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

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

person danielpunkass    schedule 08.03.2009
comment
Небольшое обновление замечательного комментария Дэниела: macOS Sierra добавила некоторые возможности в NSStatusItem, и теперь их можно перетаскивать и размещать в любом месте, и это здорово. - person Marc Edwards; 08.03.2017

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

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

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

person Sören Kuklau    schedule 08.03.2009
comment
Упомянутая запись в блоге недоступна. - person jottr; 02.11.2014

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

person onmyway133    schedule 29.06.2017