has doesn content ios iphone uiview uiscrollview autolayout

ios - doesn - scrollview xcode



iOS 7 autolayout de vista embebido en la vista de desplazamiento (1)

El truco con las vistas de desplazamiento es que las restricciones de diseño automático que se agreguen entre la vista de desplazamiento y sus subvistas dictarán el tamaño de contentSize de la vista de desplazamiento, no el tamaño de las subvistas mismas. Consulte la nota técnica TN2154 - UIScrollView y Autolayout . En realidad, esta es una función increíblemente útil (ya no tenemos que calcular / ajustar contentSize manualmente), pero hace que no sea intuitivo hacer que una subvista cambie de tamaño en función de las dimensiones de la pantalla.

Si desea que la subvista de la vista de desplazamiento cambie su tamaño a medida que pasa de vertical a horizontal, puede agregar una restricción entre la subvista de la vista de desplazamiento y la vista de raíz (es decir, entre la subvista y la supervista de la supervista). Esto no reemplaza las restricciones entre la vista de desplazamiento y sus subvistas (que aún necesita dictar el contentSize de contentSize la vista de desplazamiento), sino que lo complementa para que la subvista cambie de ancho como lo hace la vista de usuario raíz.

Puede hacerlo expandiendo el contorno del documento y controlando -dragging (o haciendo clic derecho-arrastrando) desde la subvista a la vista raíz:

A continuación, puede especificar que sus anchos sean iguales:

Al hacer esto, la subvista de la vista de desplazamiento cambiará de ancho a medida que cambie la orientación. Aquí está la recursiveDescription de una subvista de 200 puntos cuando el dispositivo estaba en retrato:

(lldb) po [[UIWindow keyWindow] recursiveDescription] <UIWindow: 0x8cbba70; frame = (0 0; 320 480); autoresize = W+H; gestureRecognizers = <NSArray: 0x8cbbca0>; layer = <UIWindowLayer: 0x8cbb4a0>> | <UIView: 0x8cbd990; frame = (0 0; 320 480); autoresize = RM+BM; layer = <CALayer: 0x8cbd040>> | | <UIScrollView: 0x8cbdb70; frame = (0 0; 320 480); clipsToBounds = YES; autoresize = W+H; gestureRecognizers = <NSArray: 0x8cc19a0>; layer = <CALayer: 0x8cbd440>; contentOffset: {0, 0}> | | | <UIView: 0x8cbdf00; frame = (0 0; 320 200); autoresize = W+H; layer = <CALayer: 0x8cbdf60>>

Y cuando entré en el paisaje, el ancho de la última subvista cambió automáticamente:

(lldb) po [[UIWindow keyWindow] recursiveDescription] <UIWindow: 0x8cbba70; frame = (0 0; 320 480); autoresize = W+H; gestureRecognizers = <NSArray: 0x8cbbca0>; layer = <UIWindowLayer: 0x8cbb4a0>> | <UIView: 0x8cbd990; frame = (0 0; 320 480); transform = [0, -1, 1, 0, 0, 0]; autoresize = RM+BM; layer = <CALayer: 0x8cbd040>> | | <UIScrollView: 0x8cbdb70; frame = (0 0; 480 320); clipsToBounds = YES; autoresize = W+H; gestureRecognizers = <NSArray: 0x8cc19a0>; layer = <CALayer: 0x8cbd440>; contentOffset: {0, 0}> | | | <UIView: 0x8cbdf00; frame = (0 0; 480 200); autoresize = W+H; layer = <CALayer: 0x8cbdf60>>

Claramente, puedes hacer lo mismo con la altura, también. En este ejemplo, acabo de tener una restricción de altura que fijó la altura en 200 pt, pero haga lo que quiera.

Obviamente también puede ir a la "vieja escuela" y responder a los eventos de diseño para ajustar de forma programática las restricciones de las subvistas, pero la técnica anterior elimina la necesidad de hacerlo.

Aquí está, probablemente, la siguiente pregunta estúpida de un novato de iOS, lo que estoy experimentando es el desplazamiento y el diseño automático.

Así que creé el guión gráfico y agregué una vista incrustada mediante la vista de desplazamiento. La vista tiene fondo blanco y establecí que el fondo de la vista de desplazamiento sea azul:

Las restricciones que ves tienen valor de 0, para que coincida con el padre. En modo retrato todo bien:

Pero en el paisaje no, la vista de la hoja no se redimensiona y se desplaza la vista (el área azul a la derecha se vuelve visible)