Qué es "Restringir al margen" en Storyboard en Xcode 6


Estoy trabajando con autolayout y restricciones y encontré que hay una opción Constrain to margins en XCode 6 que no estaba presente en XCode 5 y está marcada por defecto.

Creé un proyecto de prueba, luego agregué un UITableView en un ViewController con el marco establecido en el mismo tamaño que view y agregué restricciones

XCode 6 Puede ver aquí a pesar de que tableview tiene el mismo marco que view XCode sugiere agregar -16 como restricción, mientras que XCode 5 sugeriría agregar espaciado 0.

Con Restricción a margen comprobado

Ahora, cuando desmarca la opción" Restringir al margen", se comporta igual que XCode 5 y sugeriría agregar 0 como restricción

Con Restricción al margen sin control

También, descubrí que una vez que agrego restricción con Restricción al margen marcado, ya no puedo abrir el archivo de guion gráfico en XCode 5, por lo que definitivamente es algo nuevo en XCode 6

Espero poder explicar mi pregunta correctamente. Me gustaría entender lo que" Restringir al margen " realmente hace y cuando debería y no debería usarlo. Me disculpo si es algo muy simple y obvio.

EDITAR

He encontrado algo sobre márgenes de diseño en discusión aquí, me pregunto si está relacionado con esto.

Author: Iulian Onofrei, 2014-09-12

3 answers

No entiendo en absoluto por qué la gente se queja de que "Los márgenes causarían un bloqueo absoluto en cualquier cosa anterior a iOS 8."

Establecer sus restricciones relativas al margen en un archivo xib o guion gráfico NOHace que su aplicación se bloquee en iOS7, y NO hace una diferencia de interfaz de usuario en su dispositivo iOS7 tampoco, siempre y cuando no toque las propiedades UIView.layoutMargins y UIView.preservesSuperviewLayoutMargins en su código.

¿Qué son los márgenes en iOS8

Los márgenes de maquetación representan un relleno alrededor del interior de un UIView que el sistema de maquetación puede usar al diseñar subviews - para asegurar que quede un espacio entre el borde de una vista y una subviews. En este sentido, es muy similar a la propiedad padding asociada con los bloques en CSS.

introduzca la descripción de la imagen aquí

De forma predeterminada, un UIView tiene márgenes de diseño de 8 puntos en cada lado, y esto no se puede cambiar en Interface Builder. Sin embargo, estableciendo el UIView.layoutMargins propiedad en el código, que solo está disponible en iOS8, puede ajustar estos valores.

Puede hacer que IB muestre los márgenes con Editor > Lienzo > Mostrar Rectángulos de diseño: introduzca la descripción de la imagen aquí

Los márgenes se pueden usar para ayudar a diseñar sus vistas y subviews. Cada UIView viene con márgenes de forma predeterminada, pero solo afectan a la ubicación de la vista cuando se configura una restricción que está relacionada con un margen.

Cómo usar márgenes

La única manera de usar márgenes en Interface Builder es comprobar la opción Relativa a margin al configurar sus restricciones. Así es como dirige su restricción a Use márgenes en lugar de bordes al diseñar mi vista.

introduzca la descripción de la imagen aquí

Echemos un vistazo a cuatro formas diferentes de configurar una restricción inicial entre una vista y su subview. Para cada restricción que revisemos la primera asociación descrita será la principal del subview, y la segunda será ser líder de superview . A lo que debe prestar mucha atención es al estado de verificación y desactivación de la opción Relativa al margen de cada extremo de restricción, porque eso define si la restricción está vinculada al margen o al borde de la vista.

  1. Primer elemento(desmarcar), segundo elemento(marcar): En este caso, estamos declarando que el borde izquierdo del subview debe alinearse con el margen izquierdo del superview(como se muestra en esta imagen).

introduzca la descripción de la imagen aquí

  1. Primero elemento (desmarcado), segundo elemento(desmarcado): Ambos usando borde, no margen. En este caso, estamos declarando que el borde izquierdo de subview debe alinearse con el borde izquierdo de superview.

introduzca la descripción de la imagen aquí

  1. Primer elemento(marcar), segundo elemento(desmarcar): En este caso, estamos declarando que el margen izquierdo del subview debe alinearse con el borde izquierdo del superview. Este tipo de diseño hace que la subvista se superponga a la supervista.

introduzca la descripción de la imagen aquí

  1. Primer elemento (comprobar), segundo artículo (comprobar). Esto realmente tiene el mismo efecto que el caso 2, ya que tanto subview como superview tienen el mismo margen predeterminado. Estamos declarando que el margen izquierdo de subview debe alinearse con el margen izquierdo de superview.

introduzca la descripción de la imagen aquí

Lo bueno de los márgenes

Esta nueva característica (iOS8) solo afecta al desarrollo de la interfaz de usuario si decide usar márgenes.

Mediante el uso de márgenes puede ajustar la colocación de múltiples subvistas que comparten una común relación a un compartida por superview cambiar el valor de una sola propiedad. Esto es una clara victoria sobre establecer todas las restricciones asociadas con valores fijos, porque si necesita actualizar todo el espaciado, en lugar de cambiar cada valor uno por uno, puede modificar simultáneamente toda la ubicación relevante actualizando el margen de la superview con una sola línea de código como esta:

self.rootView.layoutMargins = UIEdgeInsetsMake(0, 50, 0, 0);

Para ilustrar este beneficio, en el siguiente caso todos los bordes izquierdos de las subvistas están alineados con el margen izquierdo de su supervista. Así, cambiando el margen izquierdo de superview afectará a todas las subviews al mismo tiempo.

introduzca la descripción de la imagen aquí

 300
Author: Scott Zhu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-08-08 18:13:33

En iOS 8 ahora tiene la opción de definir sus restricciones en relación con un margen predefinido a los límites del superview, en lugar de los límites del superview en sí. Sí, está totalmente relacionado con los márgenes de diseño a los que apuntó en los documentos. Una ventaja es que puede redefinir sus márgenes dinámicamente, o de manera diferente para cada tipo de dispositivo, y el diseño se actualizará correspondientemente sin modificar las restricciones.

Cuándo usarlo: cuando desea aprovechar esta nueva flexibilidad.

Cuándo NO usarlo: para cualquier aplicación destinada a ejecutarse en iOS 7 o inferior.

 62
Author: KPM,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-09-13 08:09:48

La propiedad en UIView es: layoutMargins. Ver el Apple Docs . Básicamente si los márgenes de diseño son 8,8,8,8 (el predeterminado), una restricción con 0 espacio inicial al margen del contenedor tendrá una posición x de 8. Tenga en cuenta que esto solo está disponible en iOS8 o posterior.

Para todos los que no quieren que sus restricciones vayan al margen del contenedor:

CTRL+clic+arrastrar para mostrar la ventana emergente de creación de restricciones.

Si el menú se muestra para crear la restricción a la margen de forma predeterminada, mantenga pulsada opción/alt para permitir que la restricción se realice en el contenedor y no en el margen del contenedor.

Ahora se mostrará la opción para crear la restricción NO al margen. Esto es CAMINO más rápido en mi uso.

 42
Author: Kyle Robson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-12-11 00:25:18