2009-03-08 20 views
10

Tutti conoscete la barra dei menu (o meglio detta NSStatusBar) in Mac OS X.
Ci sono alcuni elementi che posso spostare e altri no.Come trascinare NSStatusItems

Mi piacerebbe poter trascinare il NSStatusItem della mia app.

Qualche idea su come implementarlo?

risposta

19

Sebbene gli NSStatusItem appaiano nei "menu extra" interni di Apple, sono distinti e si comportano diversamente. Sarebbe bello se Apple unificasse gli elementi che possono apparire nell'area a destra della barra dei menu, ma per ora la sezione è divisa in "mela interna" distinta (a destra) e "app-fornita (NSStatusItem) " sulla sinistra.

È possibile visualizzare la distinzione inserendo il computer in modalità di cattura schermo (cmd-shift-4) e premendo la barra spaziatrice per passare a "Cattura finestra intera". Quando passi con il mouse sulle icone del menu di Apple, vedrai che vivono tutti in un'unica finestra. Questo spiega la loro capacità di essere facilmente gestiti e trascinati. Passando il mouse sopra gli altri elementi, è evidente che ogni NSStatusItem sta in effetti vivendo in una singola finestra (che sembra essere di proprietà dell'applicazione che lo ha installato).

È consigliabile attenersi a NSStatusItem anche se non è possibile trascinarli. È una lacuna di Apple che la maggior parte degli utenti capirà, anche se è fastidiosa. Sottolineare i compromessi positivi di offrire un'applicazione più stabile a lungo termine di solito attenuerà le opinioni dei vostri clienti (o dirigenti?) Che stanno spingendo per la draggability.

+1

Aggiornamento rapido al grande commento di Daniel: macOS Sierra ha aggiunto alcune funzionalità a NSStatusItem e ora possono essere trascinati e posizionati ovunque, il che è fantastico. –

14

Dovrai utilizzare NSMenuExtra, non NSStatusItem e rendere la voce di menu un pacchetto in esecuzione all'interno del processo SystemUIServer, non nella tua app. Avrai anche bisogno di un codice come quello fornito da MenuCracker per farlo funzionare.

NSMenuExtra non è documentato e non è supportato e pertanto è considerato un "trucco".

La mia ipotesi di due API in primo luogo: un menu in crash (o perdita di memoria) significa l'intero processo SystemUIServer che si interrompe o la perdita di memoria - inclusi altri moduli di terze parti oltre a quelli forniti dal sistema. Con un elemento di stato, d'altra parte, un tale problema avrebbe solo effetto sul tuo codice.

+1

Il post di blog di riferimento non è raggiungibile. – jottr

0

Come di 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/

applicazioni di terze parti a volte installano come comparse di menu, hanno controlli che esistono nella barra dei menu, o può essere rilanciato come applicazioni senza volto, nonostante inizialmente non essere così. A partire da macOS Sierra, questi extra di menu possono essere riorganizzati come quelli nativi. (Questo non è il caso fino a OS X El Capitan.)