2009-06-09 26 views
6

Necesito comprender cómo NSView personaliza sus vistas. Configuré todo en IB y mis subvistas cambiaron el tamaño muy bien (cuando redimensioné mi ventana con un mouse). Sin embargo, si hago [myMainView setFrame:] con mi nuevo rect marco, no pasa nada. Todas mis sub-vistas siguen siendo del tamaño original (a pesar de que la vista principal tiene las dimensiones correctas). Se llama al niño resizeWithOldSuperviewSize:, pero aún no tiene el tamaño adecuado.Comportamiento de ajuste de tamaño de NSView

Tengo una pantalla llena de elementos de cacao en la pantalla (pantalla n. ° 1), etiqueta, imagen, video. Hay un diseño bien definido para estos elementos. He configurado el comportamiento de aumento de tamaño a través de Interface Builder que funciona muy bien. Cambiar el tamaño de la ventana principal cambia el tamaño de los elementos de una manera satisfactoria.

Ahora, el usuario hace clic en el botón "siguiente", después de lo cual se dibujará una segunda pantalla llena de elementos (pantalla n. ° 2). Mis diseños se basan en un tamaño de pantalla canónico (digamos, 800x600). Pero ahora la ventana es más grande (o más pequeña) porque se redimensionó en la pantalla n. ° 1. Por lo tanto, ahora los elementos solo ocupan un área pequeña en la ventana, en lugar de tener el tamaño adecuado para llenar el espacio disponible. Quiero escalar estos elementos.

¿Entiendo mal cómo funciona el autoajuste? ¿Cómo puedo activar manualmente la máquina debajo de NSView?

Hay dos cosas que puedo hacer:

  1. cambiar manualmente el tamaño de los elementos en función del tamaño de la pantalla actual en relación con su tamaño original. Esta opción no es mi favorita porque, al parecer, me veo obligado a reescribir el código que ya está funcionando en NSView (el comportamiento de conversión de tamaño
  2. Mi segunda opción es invocar la magia de aumento de tamaño de NSView mencionada anteriormente. La documentación implica que [NSView setFrame:] Por lo que he intentado, cambie el tamaño de mi vista de contenido al tamaño de pantalla original (800x600), renderice mis elementos y luego cambie su tamaño al tamaño de la ventana actual. Conceptualmente, ¿no es idéntico al cambio de tamaño manual de la ventana? no parece ser. Una vez más, esta opción es preferible, ya que minimiza la cantidad de código que te ha ser escrito y mantenido.
+0

Pruebe [resizeSubviewsWithOldSize:] (http://developer.apple.com/documentation/Cocoa/Reference/ApplicationKit/Classes/NSView_Class/Reference/NSView.html#//apple_ref/occ/instm/NSView/resizeSubviewsWithOldSize :) o [setAutoresizesSubviews:] (http://developer.apple.com/documentation/Cocoa/Reference/ApplicationKit/Classes/NSView_Class/Reference/NSView.html#//apple_ref/occ/instm/NSView/setAutoresizesSubviews :). –

+0

No estoy seguro de lo que quieres decir aquí. Se llama a resizeSubviewsWithOldSize de los padres, setAutoresizesSubviews se establece en yes. ¿Puedes proporcionar más orientación por favor? – EightyEight

+0

El primero se debe a este último: si autoresizesSubviews está establecido en YES, entonces resizeSubviewsWithOldSize: debería llamarse automáticamente. Como lo tienes configurado y eso está sucediendo, también estoy perplejo. Lo siento. –

Respuesta

3

Resulta que mi enfoque es correcto. Estaba configurando el tamaño del marco en un valor incorrecto, por lo que no estaba obteniendo el comportamiento esperado. Doh.

+6

¿Por qué los votos a favor? – Chetan

+0

Tengo el mismo problema. Más sugerencias ... – Sunkas

20

este código

NSView* superView = [[NSView alloc] initWithFrame:NSMakeRect(0, 0, 100, 100)]; 
NSView* subView = [[NSView alloc] initWithFrame:NSMakeRect(0, 0, 100, 100)]; 
[superView addSubview:subView]; 

[superView setAutoresizesSubviews:YES]; 
[subView setAutoresizingMask:NSViewWidthSizable | NSViewHeightSizable]; 

NSLog(@"subview's frame before resizing: %@", NSStringFromRect([subView frame])); 
[superView setFrame:NSMakeRect(0, 0, 200, 100)]; 
NSLog(@"subview's frame after resizing: %@", NSStringFromRect([subView frame])); 

da el resultado esperado:

[...] subview's frame before resizing: {{0, 0}, {100, 100}} 
[...] subview's frame after resizing: {{0, 0}, {200, 100}}

Su problema está en otra parte. Supongo que una de las vistas de contenedor no forma parte de la jerarquía de vistas de la ventana en el momento en que se produce el cambio de tamaño.

Una buena solución para su problema podría ser el uso de un NSTabView sin pestañas, porque entonces todas sus vistas están en todo momento en la ventana (posiblemente ocultas) y la pestaña se encarga del redimensionamiento.

Otra solución es colocar varias vistas una encima de la otra y usar setHidden: para mostrar solo una.

+0

Esa es una idea interesante, acerca de la representación de todas las vistas. Desafortunadamente, algunos de los puntos de vista requieren bastante procesamiento, lo suficiente como para ser costoso. ¡Gran idea pensada! – EightyEight

Cuestiones relacionadas