Autoresizing masks programáticamente vs Interface Builder / xib / nib

216

Estaba en una suposición (probablemente falsa) de que habilitar el indicador de margen derecho en xib es equivalente a usar UIViewAutoresizingFlexibleLeftMargincódigo interno, etc.

Entonces, solía pensar de acuerdo con esta instantánea: ingrese la descripción de la imagen aquí

Más tarde hoy tuve que hacer una verificación cruzada, y me topé con este hilo .

Y también la documentación de Apple, titulada con la sección con el título - "Manejo de cambios de diseño automáticamente usando reglas de autoresizing" en este enlace: https://developer.apple.com/library/content/documentation/WindowsViews/Conceptual/ViewPG_iPhoneOS/CreatingViews/ CreatedViews.html

Así que ahora tengo un concepto renovado en mi mente en cuanto a cómo configurar las máscaras de autoresignificación mediante programación sería equivalente a la configuración de xib:

Escenario 1 : la configuración solo (UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight)es equivalente a:

(UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight)

En XIB?

Escenario 2 : la configuración (UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleBottomMargin)en código es equivalente a:

(UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleBottomMargin)

En XIB?

¿Son correctos mis 2 escenarios renovados? ¿Estoy ahora en mi entendimiento?

Raj Pawan Gumdal
fuente
3
¿Es una broma? Pero parece que allí también está mi confusión. Entonces, si quiero abrazar la parte superior, enciendo la parte inferior de tamaño automático. Buen trabajo manzana. Esta es la configuración más idiota que he visto.
user4951
1
Si desea abrazar la parte superior, debe asegurarse de no mencionar UIViewAutoresizingFlexibleTopMargin en el código de máscara de bits. Mi suposición anterior estaba equivocada y es por eso que había publicado esta pregunta para aclarar las cosas.
Raj Pawan Gumdal
Tu suposición es correcta. Donde te equivocas
user4951
Sí, los dos escenarios que cita son correctos.
3
Hice una herramienta simple para esto: erkanyildiz.me/lab/autoresizingmask puedes usarlo.
erkanyildiz

Respuestas:

35

Sí, Interface Builder lo tiene "invertido" en cierto sentido (o UIView, dependiendo de cómo lo veas). Sus "escenarios" citados son correctos.

Polvo oscuro
fuente
47

Sí, has citado las cosas correctamente. Además, estoy de acuerdo en que se siente un poco al revés, por eso aprecio tu publicación.

Es posible UIViewAutoresizingFlexibleMarginsque desee utilizar una macro de preprocesador al hacer que el margen de UIView sea flexible en todas las direcciones. Puse esto en el archivo de encabezado precompilado para que se incluya en todas partes.

#define UIViewAutoresizingFlexibleMargins                 \
              UIViewAutoresizingFlexibleBottomMargin    | \
              UIViewAutoresizingFlexibleLeftMargin      | \
              UIViewAutoresizingFlexibleRightMargin     | \
              UIViewAutoresizingFlexibleTopMargin

El uso UIViewAutoresizingFlexibleMarginshará que un elemento de la IU permanezca centrado ya que NO estará abrazando a ningún lado. Para hacer que el elemento crezca / se reduzca con su elemento primario, establezca el UIViewAutoresizingFlexibleWidthy UIViewAutoresizingFlexibleHeightrespectivamente.

Me gusta usar UIViewAutoresizingFlexibleMarginsporque luego puedo hacer referencia a él como:

myView.autoresizingMask = UIViewAutoresizingFlexibleMargins;

en vez de

myView.autoresizingMask = UIViewAutoresizingFlexibleBottomMargin | UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleTopMargin;

Muy a menudo veo estos márgenes O juntos en una línea como en el ejemplo anterior. Simplemente difícil de leer.

Sam
fuente
44
Flexible en todas las direcciones debe ser (UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight) ¿Supongo? O estoy confundido de nuevo!
Raj Pawan Gumdal
44
Los márgenes flexibles harán que el elemento permanezca centrado (sin abrazar el margen izquierdo, superior, derecho o inferior). El ancho / alto flexible hará que el elemento ui crezca / se contraiga respectivamente.
Sam
44
¿Está todo claro ahora? Además, lo dije en serio cuando dije que apreciaba tu publicación. En realidad lo favorecí porque esto me ha confundido en el pasado. Creo que es una gran Q.
Sam
3
Sí, gracias, ahora lo entiendo, "Márgenes flexibles" y "Ancho / alto flexible". Eso lo explica todo, y su "no abrazar el margen izquierdo, superior, derecho o inferior" es una buena manera de explicar :)
Raj Pawan Gumdal
0

ingrese la descripción de la imagen aquí

Habilitar la flecha vertical / horizontal (llamada resorte) dentro de la caja hará que la altura / anchura sea flexible. Pero habilitar una línea externa (llamada puntal) hará que ese lado sea inflexible / no flexible.

Habilitar la línea exterior izquierda (puntal izquierdo) no es equivalente a habilitar UIViewAutoresizingFlexibleRightMargin. En cambio, UIViewAutoresizingFlexibleRightMargin= encendido si el puntal derecho está deshabilitado, apagado si el puntal derecho está habilitado.

Al principio es bastante confuso, pero si ves de cerca, hay una diferencia en los resortes y puntales. No sé por qué Apple hizo esto, pero para mí, hubo algunos casos en que fue más fácil de usar. Y usar propiedades opuestas en el código es aún más confuso.

Abdurrahman Mubeen Ali
fuente
0

Swift 4 usa esto

gadBannerView?.autoresizingMask = [.flexibleRightMargin  , .flexibleLeftMargin , .flexibleTopMargin , .flexibleBottomMargin]

C objetivo

myView.autoresizingMask = UIViewAutoresizingFlexibleBottomMargin | UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleTopMargin;
Muhammad Nayab
fuente