Autolayout de cacau: conteúdo abraçando versus prioridade de resistência de compression de conteúdo

Não consigo encontrar uma resposta clara sobre a documentação da Apple em relação ao Cocoa Autolayout sobre a diferença entre o índice de conteúdo e a resistência à compression.

Alguém pode explicar seus usos e diferenças?

Resumo rápido dos conceitos:

  • Abraçando => conteúdo não quer crescer
  • Resistência à compression => o conteúdo não quer encolher

e um exemplo:

Digamos que você tenha botão assim:

 [ Click Me ] 

e você fixou as bordas em uma superview maior com prioridade 500.

Então, se Abrangendo prioridade> 500, ficará assim:

 [Click Me] 

Se a prioridade de abraçar <500, ficará assim:

 [ Click Me ] 

Se a superview agora encolher, se a prioridade da Resistência à Compressão> 500, vai ficar assim

 [Click Me] 

Caso contrário, a prioridade de resistência à compression <500, poderia ser assim:

 [Cli..] 

Se não funcionar assim, você provavelmente terá outras restrições que estão atrapalhando seu bom trabalho!

Por exemplo, você poderia fixá-lo no superview com prioridade 1000. Ou você poderia ter uma prioridade de largura. Se assim for, isso pode ser útil:

Editor> Tamanho para caber o conteúdo

Dê uma olhada neste tutorial em vídeo sobre o Autolayout , eles explicam com cuidado

insira a descrição da imagem aqui

insira a descrição da imagem aqui

fonte: @mokagio

Tamanho do conteúdo intrínseco – Bastante autoexplicativo, mas exibições com conteúdo variável estão cientes do tamanho do conteúdo e descrevem o tamanho do conteúdo por meio dessa propriedade. Alguns exemplos óbvios de visualizações que possuem tamanhos de conteúdo intrínsecos são UIImageViews, UILabels, UIButtons.

Prioridade de Abrangência de Conteúdo – Quanto maior essa prioridade, mais a visão resiste a crescer mais do que seu tamanho de conteúdo intrínseco.

Prioridade de Resistência à Compactação de Conteúdo – Quanto maior essa prioridade, mais a visão resiste a encolher menor que seu tamanho de conteúdo intrínseco.

Confira aqui mais explicações: AUTO LAYOUT MAGIC: CONTEÚDO SIZE PRIORIDADES

Digamos que você tenha um botão com o texto “Click Me”. Qual largura deve ser esse botão?

Primeiro, você definitivamente não quer que o botão seja menor que o texto. Caso contrário, o texto seria cortado. Esta é a prioridade de resistência à compression horizontal.

Segundo, você não quer que o botão seja maior do que precisa ser. Um botão parecido com isso, [Click Me], é obviamente muito grande. Você quer que o botão “abraça” seu conteúdo sem muito preenchimento. Essa é a prioridade de aarms de conteúdo horizontal. Para um botão, não é tão forte quanto a prioridade de resistência de compression horizontal.

Se view.intrinsicContentSize.width != NSViewNoIntrinsicMetric , o layout automático criará uma restrição especial do tipo NSContentSizeLayoutConstraint . Essa restrição age como duas restrições normais:

  • uma restrição que exige view.width < = view.intrinsicContentSize.width com a prioridade de aarms horizontal e
  • uma restrição que requer view.width >= view.intrinsicContentSize.width com a prioridade de resistência à compression horizontal.

No Swift, com as novas âncoras de layout do iOS 9, você poderia configurar restrições 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) 

Da mesma forma, se view.intrinsicContentSize.height != NSViewNoIntrinsicMetric , o layout automático cria um NSContentSizeLayoutConstraint que age como duas restrições na altura da exibição. No código, eles ficariam assim:

 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) 

Você pode ver essas instâncias especiais de NSContentSizeLayoutConstraint (se existirem) imprimindo view.constraints após a execução do layout. Exemplo:

 label.constraints.forEach { print($0) } // Output:   

O Abrangimento de Conteúdo e as Prioridades de Resistência à Compactação de Conteúdo funcionam para elementos que podem calcular seu tamanho intrinsecamente dependendo do conteúdo que está chegando.

Da Apple docs :

insira a descrição da imagem aqui

A Content hugging priority é como um elástico que é colocado em torno de uma vista. Quanto maior o valor de prioridade, mais forte é o elástico e mais ele deseja se adaptar ao tamanho do conteúdo. O valor de prioridade pode ser imaginado como a “força” do elástico

E a Content Compression Resistance é, quanto uma visão “resiste” a ficar menor. A Visualização com maior valor de prioridade de resistência é aquela que resistirá à compression.