729 Stimmen

Cocoa Autolayout: Inhalts umarmen vs Inhaltskomprimierungswiderstandpriorität

Ich kann in der Apple-Dokumentation keine klare Antwort zum Cocoa Autolayout über den Unterschied zwischen "content hugging" und "compression resistance" finden.

Kann mir jemand ihre Verwendungen und Unterschiede erklären?

1427voto

Snowcrash Punkte 73122

Eine kurze Zusammenfassung der Konzepte:

  • Umarmung => Inhalt möchte nicht wachsen
  • Kompressionswiderstand => Inhalt möchte nicht schrumpfen

Beispiel:

Angenommen, Sie haben einen Button wie diesen:

[       Klick Mich       ]

und Sie haben die Ränder an einem größeren übergeordneten Ansicht mit Priorität 500 angeheftet.

Dann, wenn die Umarmungspriorität > 500 ist, wird es so aussehen:

[Klick Mich]

Wenn die Umarmungspriorität < 500 ist, wird es so aussehen:

[       Klick Mich       ]

Wenn die übergeordnete Ansicht jetzt schrumpft, dann, wenn die Kompressionswiderstandspriorität > 500 ist, wird es so aussehen

[Klick Mich]

Andernfalls, wenn die Kompressionswiderstandspriorität < 500 ist, könnte es so aussehen:

[Kli..]

Wenn es nicht so funktioniert, haben Sie wahrscheinlich einige andere Einschränkungen, die Ihre gute Arbeit durcheinanderbringen!

Zum Beispiel könnten Sie es mit Priorität 1000 an die übergeordnete Ansicht geheftet haben. Oder Sie könnten eine Breitenpriorität haben. Wenn ja, kann dies hilfreich sein:

Editor > Größe an Inhalt anpassen

320voto

onmyway133 Punkte 42296

Schauen Sie sich dieses Video Tutorial über Autolayout an, sie erklären es sorgfältig

Bildbeschreibung eingeben

297voto

Balasubramanian Punkte 4786

Gib eine Bildbeschreibung hier ein

Quelle: @mokagio

Intrinsic Content Size - Ziemlich selbsterklärend, aber Ansichten mit variablem Inhalt wissen, wie groß ihr Inhalt ist und beschreiben die Größe ihres Inhalts durch diese Eigenschaft. Einige offensichtliche Beispiele für Ansichten, die intrinsische Inhaltsgrößen haben, sind UIImageViews, UILabels, UIButtons.

Content Hugging Priority - Je höher diese Priorität ist, desto mehr widersteht eine Ansicht dem Wachsen über ihre intrinsische Inhaltsgröße hinaus.

Content Compression Resistance Priority - Je höher diese Priorität ist, desto mehr widersteht eine Ansicht dem Schrumpfen unter ihre intrinsische Inhaltsgröße hinaus.

Weitere Erläuterungen finden Sie hier: AUTO LAYOUT MAGIC: INHALTSGRÖSSEPRIORITÄTEN

45voto

Bridger Maxwell Punkte 2051

Angenommen, Sie haben eine Schaltfläche mit dem Text "Klick mich". Wie breit sollte diese Schaltfläche sein?

Zunächst einmal möchten Sie auf keinen Fall, dass die Schaltfläche kleiner als der Text ist. Andernfalls würde der Text beschnitten. Dies ist die horizontale Komprimierungswiderstandspriorität.

Zweitens möchten Sie nicht, dass die Schaltfläche größer ist als nötig. Eine Schaltfläche, die so aussieht, [          Klick Mich          ], ist offensichtlich zu groß. Sie möchten, dass die Schaltfläche ihren Inhalt "umschließt", ohne zu viel Abstand. Dies ist die horizontale Inhalts-Umarmungspriorität. Für eine Schaltfläche ist sie nicht so stark wie die horizontale Komprimierungswiderstandspriorität.

21voto

rob mayoff Punkte 356759

Wenn view.intrinsicContentSize.width != NSViewNoIntrinsicMetric ist, erstellt Auto Layout eine spezielle Einschränkung vom Typ NSContentSizeLayoutConstraint. Diese Einschränkung verhält sich wie zwei normale Einschränkungen:

  • eine Einschränkung, die view.width <= view.intrinsicContentSize.width mit der horizontalen Umarmungspriorität erfordert, und
  • eine Einschränkung, die view.width >= view.intrinsicContentSize.width mit der horizontalen Komprimierungswiderstandspriorität erfordert.

In Swift, mit den neuen Layout-Ankern von iOS 9 können Sie äquivalente Einschränkungen wie folgt einrichten:

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)

Ebenso, wenn view.intrinsicContentSize.height != NSViewNoIntrinsicMetric ist, erstellt Auto Layout ein NSContentSizeLayoutConstraint, das wie zwei Einschränkungen für die Höhe der Ansicht wirkt. Im Code würden sie so aussehen:

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)

Sie können diese speziellen NSContentSizeLayoutConstraint-Instanzen (wenn sie existieren) sehen, indem Sie view.constraints nach dem Layout drucken. Beispiel:

label.constraints.forEach { print($0) }

// Ausgabe:

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X