2011-10-05 12 views
7

Quindi pensavo di aver coperto le mie basi, ma a quanto pare mi manca un passaggio chiave o due.NSPanel con "Barra del titolo" deselezionata in Interface Builder non appare

Ho un NSPanel che viene visualizzato (makeKeyAndOrderFront:) quando viene premuto un NSStatusItem. Le cose funzionano alla grande, ma siccome NSPanel mostra una barra del titolo, il pannello è anche trascinabile. (Questo non è desiderato.)

Il primo screenshot mostra il pannello con "Barra del titolo" abilitata in Interface Builder, nella categoria Aspetto. (Ci scusiamo per la sfocatura, le cose sono ancora sotto chiave, per ora.)

First screenshot

L'unica cambiamento che viene fatta in Interface Builder è deselezionando la casella di controllo "barra del titolo". Quindi salvi e rieseguo, ed è quello che vedi nel secondo screenshot. Mentre appare una leggera ombra, il pannello no.

enter image description here

Le cose che ho provato:

  • ho sottoclasse il NSPanel e ritornai YES per canBecomeKeyWindow e canBecomeMainWindow dopo un po 'di ricerca, ma (prima di sottoclassi) questi entrambi i metodi restituiscono NO indipendentemente dal fatto che stia usando o meno una barra del titolo. Quindi non penso che questo sia il problema.

  • Mi sono assicurato che il frame per NSPanel sia impostato correttamente. Ha una buona altezza e anche l'origine è impostata correttamente.

Edit: dimenticato di dire:

L'applicazione è un'applicazione menù-bar-solo. Nello screenshot qui sotto, nota che è stata aggiunta una voce aggiuntiva a Info.plist per far rispettare questo.

Info Plist

risposta

4

Ho avuto problemi con questo in passato. Sono stato in grado di risolverlo prima "ignorando" altre app, quindi rendendola la finestra chiave. Fai un tentativo e vedi se funziona per te.

Inoltre, provare a impostare il livello finestra su NSPopUpMenuWindowLevel durante l'inizializzazione.

[[self window]setLevel:NSPopUpMenuWindowLevel]; 

Ho anche avuto problemi con il modo in cui NIB file vengono caricati su Mac OS X. Sono caricati "pigramente", il che significa che essi non verranno inizializzate fino a quando non sono necessari . Questo causa un problema quando si desidera impostare specifiche sulla finestra, ma non è possibile perché awakeFromNib non sembra essere chiamato, a causa del caricamento pigro pennino. Per risolvere il problema, ecco cosa ho fatto in passato. Nel suo delegato (o dovunque si inizializza la finestra), calciare la finestra in azione accedendo alla proprietà window sulla classe inizializzata:

wc = [[blah alloc]initWithWindowNibName:NSStringFromClass([blah class])]; 
(void)[wc window]; //just kicks the lazy nib loading into gear 

In questo modo, si sta costringendo il pennino per inizializzare. In questo modo, quando l'utente fa clic sull'icona del menu, il pennino è già inizializzato e awakeFromNib è già stato chiamato.

+0

Sfortunatamente, nessuna di queste soluzioni sembra aver aiutato. :( –

+0

Sei sicuro? Dove stai mettendo questo? Hai provato a usarli contemporaneamente? Inoltre, aggiungerò qualcosa nella mia risposta. –

+0

No, sai cosa, hai ragione. C'era qualche altro codice che stava interferendo con quei cambiamenti.Le cose sono ancora un po 'traballanti, ma ho intenzione di cancellare parte del codice e tornare. –

1

Mentre appare una leggera ombra, il pannello non lo fa.

Stai dicendo makeKeyAndOrderFront: su questo oggetto NSPanel non viene visualizzato durante l'esecuzione della tua app? Ho appena creato un progetto di esempio, NSButton attiva lo stesso tipo di NSPanel da visualizzare e funziona benissimo .. abilitato o meno.

http://cl.ly/3d0U3C0P3u2D0m3T1w1N

+0

concordato. Non sembra possibile riprodurre questo, ci deve essere qualcos'altro nel codebase che sta causando questo comportamento. – jrturton

+0

Forse ho lasciato fuori un pezzo cruciale del puzzle. Nel file Info.plist, l'applicazione deve anche essere registrata come agente. (Questa è un'app solo per la barra dei menu, quindi non è preferita l'icona del Dock.) Domanda aggiornata con screenshot. –

Problemi correlati