web-dev-qa-db-fra.com

Cocoa Autolayout: priorité au contenu contre la compression du contenu

Je ne trouve pas de réponse claire dans la documentation Apple concernant Cocoa Autolayout concernant la différence entre le calage du contenu et la résistance à la compression.

Quelqu'un peut-il expliquer leurs usages et leurs différences?

624
dmitrynikolaev

Un résumé rapide des concepts:

  • Hugging => le contenu ne veut pas grandir
  • Résistance à la compression => le contenu ne veut pas se réduire

Exemple:

Dites que vous avez un bouton comme celui-ci:

[       Click Me      ]

et vous avez épinglé les bords à un superview plus important avec la priorité 500.

Ensuite, si Priorité Hugging> 500 cela ressemblera à ceci:

[Click Me]

Si Priorité <500, cela ressemble à ceci:

[       Click Me      ]

Si la super vue diminue maintenant, si la priorité de résistance à la compression> 500, cela ressemblera à ceci

[Click Me]

Sinon, si la priorité de résistance à la compression est inférieure à 500, elle pourrait ressembler à ceci:

[Cli..]

Si cela ne fonctionne pas comme cela, alors vous avez probablement d'autres contraintes qui gâchent votre bon travail!

Par exemple. vous pourriez l'avoir épinglé à la superview avec la priorité 1000. Ou vous pourriez avoir une priorité de largeur. Si oui, cela peut être utile:

Editeur> Adapter la taille au contenu

1278
Snowcrash

Regardez cette vidéo tutoriel sur Autolayout , ils l'expliquent attentivement

enter image description here

286
onmyway133

enter image description here

source: @ mokagio

Taille du contenu intrinsèque - Cela se passe d'explication, mais les vues à contenu variable connaissent la taille de leur contenu et décrivent la taille de leur contenu à l'aide de cette propriété. UIImageViews, UILabels, UIButtons sont des exemples évidents de vues ayant des tailles de contenu intrinsèques.

Priorité d'accrochage du contenu - Plus cette priorité est élevée, plus une vue résiste à une taille supérieure à sa taille de contenu intrinsèque.

Priorité de résistance à la compression du contenu - Plus cette priorité est élevée, plus une vue résiste à une taille inférieure à sa taille de contenu intrinsèque.

Cochez ici pour plus d'explications: MAGIC LAURÉ AUTO: PRIORITÉS DE CALIBRAGE DE CONTEN

156
Balasubramanian

Disons que vous avez un bouton avec le texte, "Cliquez sur moi". Quelle largeur doit avoir ce bouton?

Premièrement, vous ne voulez certainement pas que le bouton soit plus petit que le texte. Sinon, le texte serait tronqué. C'est la priorité de résistance à la compression horizontale.

Deuxièmement, vous ne voulez pas que le bouton soit plus gros que nécessaire. Un bouton qui ressemble à ceci, [Click Me], est évidemment trop gros. Vous voulez que le bouton "embrasse" son contenu sans trop de bourrage. Il s’agit de la priorité du contenu horizontal. Pour un bouton, il n’est pas aussi puissant que la priorité de résistance à la compression horizontale.

39
Bridger Maxwell

Si view.intrinsicContentSize.width != NSViewNoIntrinsicMetric, la disposition automatique crée une contrainte spéciale de type NSContentSizeLayoutConstraint. Cette contrainte agit comme deux contraintes normales:

  • une contrainte nécessitant view.width <= view.intrinsicContentSize.width avec la priorité d'accolement horizontal, et
  • une contrainte nécessitant view.width >= view.intrinsicContentSize.width avec la priorité de résistance à la compression horizontale.

Dans Swift, avec les nouvelles ancres de mise en page d'iOS 9, vous pouvez définir des contraintes équivalentes telles que:

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 même, si view.intrinsicContentSize.height != NSViewNoIntrinsicMetric, la mise en page automatique crée un NSContentSizeLayoutConstraint qui agit comme deux contraintes sur la hauteur de la vue. Dans le code, ils ressembleraient à ceci:

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)

Vous pouvez voir ces instances spéciales NSContentSizeLayoutConstraint (si elles existent) en imprimant view.constraints après la mise en page. Exemple:

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>
18
rob mayoff

L'étirement du contenu et les priorités de résistance à la compression du contenu fonctionnent pour les éléments qui peuvent calculer leur taille intrinsèquement en fonction du contenu entrant.

De documentation Apple :

enter image description here

14
dev gr

Le Content hugging priority est semblable à un bande élastique placé autour d'une vue. Plus la valeur de priorité est élevée, plus l'élastique est résistant et plus il souhaite respecter la taille de son contenu. La valeur prioritaire peut être imaginée comme la "force" de l'élastique

Et le Content Compression Resistance correspond à combien une vue "résiste" pour devenir plus petite La vue avec une valeur de priorité de résistance plus élevée est celle qui résiste à la compression.

9
Naishta