Pregunta

Necesito entender cómo NSView automáticamente dimensiona sus vistas.Configuré todo en IB y mis subvistas cambian de tamaño muy bien (cuando cambio el tamaño de mi ventana con el mouse).Sin embargo, si lo hago [myMainView setFrame:] Con mi nuevo cuadro correcto, no pasa nada.Todas mis subvistas siguen teniendo el tamaño original (aunque la vista principal tiene las dimensiones correctas).infantil resizeWithOldSuperviewSize: se llama, pero todavía no tiene el tamaño adecuado.

Tengo una pantalla llena de elementos de cacao (pantalla n.° 1), etiqueta, imagen, video.Hay un diseño bien definido para estos elementos.Configuré el comportamiento de tamaño automático 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 manera satisfactoria.

Ahora, el usuario hace clic en el botón "siguiente", tras lo cual se dibujará una segunda pantalla llena de elementos (pantalla n.° 2).Mis diseños se crean en función de un tamaño de pantalla canónico (digamos, 800x600).Pero ahora la ventana es más grande (o más pequeña) porque se cambió su tamaño en la pantalla n.° 1.Por lo tanto, los elementos ahora 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.

¿Estoy entendiendo mal cómo funciona el tamaño automático?¿Cómo puedo activar manualmente la maquinaria de tamaño automático debajo de NSView?

Hay dos cosas que puedo hacer:

  1. Cambie manualmente el tamaño de los elementos según el tamaño de pantalla actual en relación con el tamaño original.Esta opción no es mi favorita porque aparentemente me veo obligado a reescribir el código que ya está funcionando en NSView (el comportamiento de tamaño automático
  2. Mi segunda opción es invocar la magia de tamaño automático de NSView antes mencionada.La documentación implica que [NSView setFrame:] lo hará por mí.Lo que intenté fue cambiar el tamaño de mi vista de contenido al tamaño de pantalla original (800x600), renderizar mis elementos y luego cambiar su tamaño al tamaño de ventana actual.Conceptualmente, ¿no es idéntico a cambiar el tamaño de la ventana manualmente?Parece que no lo es.Nuevamente, esta opción es preferible porque minimiza la cantidad de código que debe escribirse y mantenerse.
¿Fue útil?

Solución 2

Resulta que mi enfoque es correcto. Yo estaba sentado el tamaño del marco de un valor incorrecto, por lo que no estaba recibiendo el comportamiento esperado. Doh.

Otros consejos

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. Espero que uno de sus puntos de vista recipiente no es una parte de la vista de jerarquía 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 todos sus puntos de vista son en todo momento en la ventana (posiblemente oculto) y la TabView se encarga del cambio de tamaño.

Otra solución es poner varios puntos de vista sobre uno encima del otro y utilizar setHidden: para mostrar sólo una.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top