tutorial ratio priority constraint align cocoa autolayout

ratio - Cocoa Autolayout: prioridad de resistencia a la compresión de contenido vs compresión de contenido



swift 4 autolayout (7)

Breve resumen de los conceptos:

  • Abrazando => el contenido no quiere crecer
  • Resistencia a la compresión => el contenido no quiere reducirse

y un ejemplo:

Digamos que tienes un botón como este:

[ Click Me ]

y ha fijado los bordes a una vista mayor con prioridad 500.

Entonces, si la prioridad de Hugging> 500 se verá así:

[Click Me]

Si la prioridad de Hugging <500 se verá así:

[ Click Me ]

Si ahora la vista de supervisión se reduce, si la prioridad de Resistencia a la compresión> 500, se verá así

[Click Me]

De lo contrario, si la prioridad de Resistencia a la compresión es <500, podría verse así:

[Cli..]

¡Si no funciona así, es probable que tengas otras limitaciones que están arruinando tu buen trabajo!

Por ejemplo, podría tenerlo fijado en la vista de supervisión con prioridad 1000. O podría tener una prioridad de ancho. Si es así, esto puede ser útil:

Editor> Tamaño para ajustar el contenido

No puedo encontrar una respuesta clara en la documentación de Apple con respecto a Cocoa Autolayout sobre la diferencia entre contenido y resistencia a la compresión.

¿Alguien puede explicar sus usos y la diferencia?


Digamos que tienes un botón con el texto "Haz clic en mí". ¿Qué ancho debe tener ese botón?

Primero, definitivamente no quieres que el botón sea más pequeño que el texto. De lo contrario, el texto sería recortado. Esta es la prioridad de la resistencia de compresión horizontal.

Segundo, no quieres que el botón sea más grande de lo que debe ser. Un botón que se veía así, [Click Me], obviamente es demasiado grande. Desea que el botón "abrace" su contenido sin demasiado relleno. Esta es la prioridad de abrazar el contenido horizontal. Para un botón, no es tan fuerte como la prioridad de la resistencia de compresión horizontal.



La Content hugging priority es como una banda elástica que se coloca alrededor de una vista. Cuanto más alto sea el valor de prioridad, más fuerte será la banda elástica y más querrá abrazar a su tamaño de contenido. El valor de prioridad se puede imaginar como la "fuerza" de la banda de goma

Y la Content Compression Resistance es, cuánto se "resiste" una vista a hacerse más pequeña. La vista con mayor valor de prioridad de resistencia es la que resistirá la compresión.


Las prioridades de resistencia al contenido y la compresión de contenido funcionan para elementos que pueden calcular su tamaño intrínsecamente en función de los contenidos que ingresan.

De Apple docs :


Si view.intrinsicContentSize.width != NSViewNoIntrinsicMetric , el diseño automático crea una restricción especial de tipo NSContentSizeLayoutConstraint . Esta restricción actúa como dos restricciones normales:

  • una restricción que requiere view.width <= view.intrinsicContentSize.width con la prioridad de view.width <= view.intrinsicContentSize.width horizontal, y
  • una restricción que requiere view.width >= view.intrinsicContentSize.width con la prioridad de resistencia de compresión horizontal.

En Swift, con los nuevos anclajes de diseño de iOS 9, podría configurar restricciones equivalentes como esta:

let horizontalHugging = view.widthAnchor.constraint( lessThanOrEqualToConstant: view.intrinsicContentSize.width) horizontalHugging.priority = view.contentHuggingPriority(for: .horizontal) let horizontalCompression = view.widthAnchor.constraint( greaterThanOrEqualToConstant: view.intrinsicContentSize.width) horizontalCompression.priority = view.contentCompressionResistancePriority(for: .horizontal)

De manera similar, si view.intrinsicContentSize.height != NSViewNoIntrinsicMetric , el diseño automático crea una NSContentSizeLayoutConstraint que actúa como dos restricciones en la altura de la vista. En código, se verían así:

let verticalHugging = view.heightAnchor.constraint( lessThanOrEqualToConstant: view.intrinsicContentSize.height) verticalHugging.priority = view.contentHuggingPriority(for: .vertical) let verticalCompression = view.heightAnchor.constraint( greaterThanOrEqualToConstant: view.intrinsicContentSize.height) verticalCompression.priority = view.contentCompressionResistancePriority(for: .vertical)

Puede ver estas instancias especiales de NSContentSizeLayoutConstraint (si existen) imprimiendo view.constraints después de que se haya ejecutado el diseño. Ejemplo:

label.constraints.forEach { print($0) } // Output: <NSContentSizeLayoutConstraint:0x7fd82982af90 H:[UILabel:0x7fd82980e5e0''Hello''(39)] Hug:250 CompressionResistance:750> <NSContentSizeLayoutConstraint:0x7fd82982b4f0 V:[UILabel:0x7fd82980e5e0''Hello''(21)] Hug:250 CompressionResistance:750>


fuente: @mokagio

Tamaño de contenido intrínseco : bastante autoexplicativo, pero las vistas con contenido variable son conscientes de cuán grande es su contenido y describen el tamaño de su contenido a través de esta propiedad. Algunos ejemplos obvios de vistas que tienen tamaños de contenido intrínseco son UIImageViews, UILabels, UIButtons.

Content Hugging Priority : cuanto más alta es esta prioridad, más resiste una vista a crecer más que su tamaño de contenido intrínseco.

Prioridad de resistencia a la compresión de contenido : cuanto más alta es esta prioridad, más se resiste una vista a reducir su tamaño de contenido intrínseco.

Consulte aquí para obtener más información: AUTO LAYOUT MAGIC: PRIORIDADES DE TAMAÑO DEL CONTENIDO