2010-02-12 19 views
10

Tengo un problema extraño al colocar una ventana en la pantalla. Quiero centrar la ventana en la pantalla, pero no sé cómo hacer eso. Esto es lo que tengo. La ventana está creado a partir de la semilla por el controlador principal:Anomalía de la posición de la ventana de cacao

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

Ahora el IdentFormController tiene método awakeFromNib() en el que se trata de posicionar la ventana. En aras de la simplicidad, acabo de intentar hacer setFrameOrigin (NSMakePoint (0, 0)). Lo que ocurre es lo siguiente:

La primera vez que creo esta ventana, todo funciona como se esperaba. Pero si lo vuelvo a crear después de liberar el anterior, comienza a aparecer en posiciones aleatorias. ¿Porque hace eso?

+5

* ftf * es un nombre horrible para una variable y podría convertirse en un problema de mantenimiento más adelante. –

Respuesta

1

En primer lugar, parece que debe marcar "dealloc on close" o "release close" en el inspector de propiedades NSWindow. A continuación, la ventana se limpiará y podrá eliminar la llamada (arriesgada) al [self release] en su propio código.

awakeFromNib se llama después de que todos los objetos de la punta se han desarchivado y se han conectado tomas de corriente, pero puede ser demasiado pronto para establecer las coordenadas de la ventana. Creo que Cocoa hace algo de trabajo para colocar automáticamente las ventanas siguientes debajo y a la derecha de las ventanas existentes, para que las nuevas ventanas no oculten por completo las antiguas. Es probable que haga esto DESPUÉS de establecer la posición en awakeFromNib, pisoteando sus cambios.

El mejor lugar para establecer su posición de ventana es probablemente en uno de los métodos de delegación NSWindow (windowWillBecomeVisible: quizás), o posiblemente justo antes de llamar al makeKeyAndOrderFront:.

+0

Por alguna razón, no funcionó cuando se verificó el lanzamiento al cerrar. La ventana podría haber estado deslocalizando y limpiando, pero ¿qué hay del controlador? Tal vez no fue desasignado. Tan pronto como agregué [self release] - la cosa finalmente funcionó.Tal vez sea arriesgado, pero al menos funciona y cuando liberas un controlador, también limpia la ventana. – Marius

+0

Creo que malinterpreté '[self release]' como aplicable a la instancia de NSWindow, no al controlador. Tal vez para aclarar las cosas, el delegado de su aplicación debe mantener un puntero al IdentFormController actual. O si tiene que soltarse, use 'autorelease' para que el objeto no sea desasignado hasta el final del ciclo de ejecución. De todos modos: ¿se movió el código a la ayuda de un método delegado? – benzado

+0

Bueno, no tuve la oportunidad de probarlo todavía, pero estoy seguro de que funcionaría. Si funciona con [self release] - entonces ¿por qué no funciona desde afuera? Por cierto: ¿por qué es [auto-lanzamiento] arriesgado? Si estoy seguro de que no necesitaré este controlador y nada intentará acceder a él, ¿qué problemas podría ocurrir con [self release]? – Marius

0

Compruebe si puede establecer el centro de su ventana con el centro de la pantalla. Y establecer la posición de la ventana en él. Podría funcionar.

14

Entonces, según tengo entendido, ¿quiere centrar la ventana en la pantalla?

bien asumiendo NSWindow *window es el objeto de la ventana entonces hay dos métodos ...

[window center]; 

Ésta es la mejor manera de hacerlo pero será Ofset tener en cuenta el peso visual y la presencia del muelle.

Si desea punto muerto, entonces esto podría funcionar ...

// 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]; 

Este código no se ha probado, pero te da una idea clara de lo que hay que hacer para conseguir esta cosa funcione de la manera que desee, Personalmente, le aconsejo que se quede con el código de Apple porque ha sido probado y es lo que el usuario esperaría ver, también desde el punto de vista del diseño como diseñador. No siempre confío en que el centro real esté donde está el centro óptico. es.

5

Probablemente esté pasando por alto el posicionamiento automático de la ventana. ¿Has intentado llamar al

[myWindowController setShouldCascadeWindows: NO]; 

?

Cuestiones relacionadas