2009-03-08 5 views
10

Vous connaissez tous la barre de menu (ou mieux dit NSStatusBar) sous Mac OS X.
Il y a des éléments que je peux déplacer et d'autres qui ne le sont pas.Comment faire glisser NSStatusItems

Je voudrais être en mesure de faire glisser le NSStatusItem de mon application.

Une idée de comment implémenter cela?

Répondre

19

Bien que NSStatusItems apparaissent à proximité des "options de menu" internes d'Apple, ils sont distincts et se comportent différemment. Ce serait bien si Apple unifiait les éléments qui peuvent apparaître dans la partie droite de la barre de menu, mais pour l'instant la section est divisée en "apple interne" (à droite) et "app-provided (NSStatusItem)" " sur la gauche.

Vous pouvez visualiser la distinction en mettant votre ordinateur en mode de capture d'écran (cmd-shift-4), et en appuyant sur la barre d'espace pour passer à "capturer toute la fenêtre". Lorsque vous survolez les icônes de menu d'Apple, vous verrez qu'ils vivent tous dans une seule fenêtre. Ceci explique leur capacité à être facilement géré et traîné. En survolant les autres éléments, on constate que chaque NSStatusItem vit en réalité dans une fenêtre unique (qui appartient à l'application qui l'a installé).

Il est préférable de s'en tenir à NSStatusItem même si vous ne pouvez pas les faire glisser. C'est une lacune d'Apple que la plupart des utilisateurs comprendront, même si c'est ennuyeux. Souligner les compromis positifs d'offrir une application plus stable à long terme adoucira généralement les opinions de vos clients (ou gestionnaires?) Qui poussent à la traîne.

+1

Mise à jour rapide de l'excellent commentaire de Daniel: macOS Sierra a ajouté quelques capacités à NSStatusItem, et ils peuvent maintenant être déplacés et placés n'importe où, ce qui est génial. –

14

Vous devez utiliser NSMenuExtra, pas NSStatusItem et faire l'élément de menu en cours d'exécution un paquet à l'intérieur du processus SystemUIServer, pas votre propre application. Vous aurez également besoin d'un code comme celui fourni par MenuCracker pour que cela fonctionne.

NSMenuExtraNSMenuExtra est non documenté et non pris en charge, et donc considéré comme un "hack". Je suppose qu'il y a deux API en premier lieu: un crash supplémentaire (ou une fuite de mémoire) signifie que l'ensemble du processus SystemUIServer s'écrase ou fuit la mémoire - y compris d'autres modules tiers ainsi que ceux fournis par le système. D'un autre côté, avec un élément d'état, un tel problème n'affecterait que votre propre code.

+1

L'entrée de blog référencée est inaccessible. – jottr

0

Comme de 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/

applications tierces installent parfois comme figurants de menu, ont des contrôles qui existent dans la barre de menus, ou peuvent être relancées comme des applications sans visage en dépit de ne pas être au départ si. À partir de macOS Sierra, ces extras de menu peuvent être réarrangés comme ceux d'origine. (Ce n'était pas le cas jusqu'à OS X El Capitan.)