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?
Un résumé rapide des concepts:
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
Regardez cette vidéo tutoriel sur Autolayout , ils l'expliquent attentivement
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
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.
Si view.intrinsicContentSize.width != NSViewNoIntrinsicMetric
, la disposition automatique crée une contrainte spéciale de type NSContentSizeLayoutConstraint
. Cette contrainte agit comme deux contraintes normales:
view.width <= view.intrinsicContentSize.width
avec la priorité d'accolement horizontal, etview.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>
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 :
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.