2010-02-12 18 views
10

Ho un problema strano con il posizionamento di una finestra sullo schermo. Voglio centrare la finestra sullo schermo, ma non so come farlo. Ecco cosa ho. La finestra è creata dal pennino dal controllore principale:Anomalia posizione finestra cacao

IdentFormController *ftf = [[IdentFormController alloc] initWithWindowNibName:@"IdentForm"]; 
[[ftf window] makeKeyAndOrderFront:self]; 

Ora l'IdentFormController ha metodo di awakeFromNib() in cui si cerca di posizionare la finestra. Per semplicità ho appena provato a fare setFrameOrigin (NSMakePoint (0, 0)). Quello che succede è il seguente:

La prima volta che creo questa finestra, tutto funziona come previsto. Ma se lo creo di nuovo dopo aver rilasciato il precedente, inizia a comparire in posizioni casuali. Perché lo fa?

+5

* ftf * è un nome orribile per una variabile e potrebbe diventare un problema di manutenzione in seguito. –

risposta

1

Prima di tutto, sembra che sia necessario controllare "dealloc on close" o "release on close" nell'ispettore della proprietà NSWindow. Quindi la finestra si ripulirà da sola ed è possibile rimuovere la chiamata (rischiosa) a [self release] nel proprio codice.

awakeFromNib viene chiamato dopo che tutti gli oggetti dal pennino non sono stati archiviati e le prese sono state collegate, ma potrebbe essere troppo presto per impostare le coordinate della finestra. Credo che Cocoa faccia del lavoro per posizionare automaticamente le finestre successive in basso a destra delle finestre esistenti, in modo che le nuove finestre non oscurino completamente quelle vecchie. È probabile che ciò avvenga DOPO aver impostato la posizione in awakeFromNib, calpestando le modifiche.

Il posto migliore per impostare la posizione della finestra è probabilmente in uno dei metodi delegati NSWindow (windowWillBecomeVisible: forse) o eventualmente prima di chiamare makeKeyAndOrderFront:.

+0

Per qualche motivo non ha funzionato quando è stata verificata la chiusura in chiusura. La finestra potrebbe essere stata deallocata e ripulita, ma per quanto riguarda il controller? Forse non era stato rilasciato. Non appena ho aggiunto [self release], la cosa finalmente ha funzionato.Forse è rischioso, ma almeno funziona e quando si rilascia un controller - quindi pulisce anche la finestra. – Marius

+0

Penso di aver erroneamente interpretato '[auto release]' come applicato all'istanza NSWindow, non al controller. Forse per rendere le cose più chiare, il delegato dell'app dovrebbe mantenere un puntatore all'attuale IdentFormController. O se devi rilasciare self, usa 'autorelease' così l'oggetto non viene deallocato fino alla fine del ciclo di esecuzione. Indipendentemente da ciò: è stato spostato il codice su un metodo delegato? – benzado

+0

Beh, non ho ancora avuto la possibilità di testarlo, ma sono sicuro che funzionerebbe. Se funziona con [auto rilascio] - allora perché non dovrebbe funzionare dall'esterno. A proposito: perché [l'auto release] è rischioso? Se sono sicuro che non avrò bisogno di questo controller e non accadrà nulla per tentare di accedervi, quali potrebbero essere i problemi con [self release]? – Marius

0

Controlla se è possibile impostare il centro della finestra con il centro dello schermo. E imposta la posizione della finestra su di esso. Potrebbe funzionare.

14

Quindi, come ho capito, vuoi centrare la finestra sullo schermo?

Beh assumendo NSWindow *window è il tuo oggetto window poi ci sono due metodi ...

[window center]; 

Questo è il modo migliore per farlo, ma sarà OFSET di prendere in considerazione il peso visivo e la presenza del Dock.

Se si vuole morto, allora questo dovrebbe funzionare ...

// Calculate the actual center 
CGFloat x = (window.screen.frame.size.width - window.frame.size.width)/2; 
CGFloat y = (window.screen.frame.size.height - window.frame.size.height)/2; 

// Create a rect to send to the window 
NSRect newFrame = NSMakeRect(x, y, window.frame.size.width, window.frame.size.height); 

// Send message to the window to resize/relocate 
[window setFrame:newFrame display:YES animate:NO]; 

Questo codice non è testato, ma ti dà una buona idea di ciò che è necessario fare per ottenere questa cosa a lavorare nel modo desiderato, personalmente ti consiglierei di attenersi al codice Apple perché è stato testato ed è ciò che l'utente si aspetterebbe di vedere, anche dal punto di vista del design come designer non mi baso sempre sul centro effettivo per essere dove il centro ottico è.

5

Probabilmente stai scappando dal posizionamento automatico della finestra. Hai provato a chiamare

[myWindowController setShouldCascadeWindows: NO]; 

?