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?
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?
Eine kurze Zusammenfassung der Konzepte:
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
Schauen Sie sich dieses Video Tutorial über Autolayout an, sie erklären es sorgfältig
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
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.
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:
view.width <= view.intrinsicContentSize.width
mit der horizontalen Umarmungspriorität erfordert, undview.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 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.