Question Cocoa Autolayout: contenu étreignant vs priorité de compression de contenu


Je ne peux pas trouver une réponse claire sur la documentation d'Apple concernant Cocoa Autolayout sur la différence entre l'étreinte du contenu et la résistance à la compression.

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


574
2018-04-06 11:34


origine


Réponses:


Résumé rapide des concepts:

  • Étreindre => le contenu ne veut pas grandir
  • Résistance à la compression => le contenu ne veut pas rétrécir

et un exemple:

Dites que vous avez un bouton comme celui-ci:

[       Click Me      ]

et vous avez épinglé les bords à un plus grand aperçu avec la priorité 500.

Ensuite, si priorité à étreindre> 500 cela ressemblera à ceci:

[Click Me]

Si la priorité étreinte <500, cela ressemblera à ceci:

[       Click Me      ]

Si superview se réduit alors, si la priorité Compression Resistance> 500, cela ressemblera à ceci

[Click Me]

Sinon, si la priorité de la résistance à la compression est <500, cela pourrait ressembler à ceci:

[Cli..]

Si cela ne fonctionne pas comme ça, 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> Taille pour s'adapter au contenu


1200
2018-04-29 14:29



Regarde cette vidéo tutoriel sur Autolayout, ils l'expliquent soigneusement

enter image description here


268
2018-04-21 18:23



enter image description here

la source: @mokagio

Taille de contenu intrinsèque - Assez explicite, mais les vues à contenu variable sont conscientes de la taille de leur contenu et décrivent la taille de leur contenu grâce à cette propriété. UIImageViews, UILabels, UIButtons sont des exemples évidents de vues ayant des tailles de contenu intrinsèques.

Priorité étreignant le contenu - Plus cette priorité est élevée, plus une vue résiste à une croissance supérieure à sa taille de contenu intrinsèque.

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

Vérifiez ici pour plus d'explications: MAGIE AUTO LAYOUT: PRIORITÉS DE CALIBRAGE DU CONTENU


89
2017-09-10 14:00



Disons que vous avez un bouton avec le texte "Click Me". Quelle devrait être la largeur de ce bouton?

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

Deuxièmement, vous ne voulez pas que le bouton soit plus grand que nécessaire. Un bouton qui ressemblait à ceci, [Click Me], est évidemment trop gros. Vous voulez que le bouton "embrasse" son contenu sans trop de remplissage. C'est la priorité horizontale du contenu. Pour un bouton, il n'est pas aussi fort que la priorité de résistance à la compression horizontale.


36
2018-04-07 16:07



Si view.intrinsicContentSize.width != NSViewNoIntrinsicMetric, puis la mise en page 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'étreinte horizontale, 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 iOS 9, vous pouvez configurer des contraintes équivalentes comme ceci:

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, puis la mise en page automatique crée un NSContentSizeLayoutConstraint cela 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 spéciaux NSContentSizeLayoutConstraint instances (si elles existent) en imprimant view.constraints après la mise en page a couru. 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>

17
2017-08-14 20:29



Les stratégies de maintien de la compression du contenu et de la compression du contenu fonctionnent pour les éléments qui peuvent calculer intrinsèquement leur taille en fonction des contenus qui arrivent.

De Apple docs:

enter image description here


14
2018-02-09 09:16



le Content hugging priority Est comme un Élastique qui est placé autour d'une vue. Plus la valeur de la priorité est élevée, plus l'élasticité est forte et plus elle veut caler sur sa taille de contenu. La valeur prioritaire peut être imaginée comme la «force» de l'élastique

Et le Content Compression Resistance est, combien voir "résiste" de plus en plus petit  La vue avec une valeur de priorité de résistance supérieure est celle qui résistera à la compression.


8
2018-05-21 06:04