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?

15voto

dev gr Punkte 2299

Huggen des Inhalts und Prioritäten für die Widerstandskraft des Inhalts funktionieren für Elemente, die ihre Größe intrinsisch berechnen können, abhängig von den Inhalten, die eingehen.

Von Apple Docs:

Bildbeschreibung hier eingeben

15voto

Naishta Punkte 10822

Die Inhalts-Halte-Priorität ist wie ein Gummiband, das um eine Ansicht gelegt wird. Je höher der Prioritätswert, desto stärker ist das Gummiband und desto mehr möchte es sich an die Inhaltsgröße anpassen. Der Prioritätswert kann als die "Stärke" des Gummibands betrachtet werden.

Und der Inhalts-Kompressionswiderstand ist, wie sehr eine Ansicht sich dagegen wehrt, kleiner zu werden. Die Ansicht mit einem höheren Widerstandsprioritätswert ist diejenige, die sich gegen Kompression wehrt.

0voto

ahmed Punkte 540

contentCompressionResistancePriority - Die Ansicht mit dem niedrigsten Wert wird abgeschnitten, wenn nicht genügend Platz ist, um den intrinsicContentSize alles zu passen

contentHuggingPriority - Die Ansicht mit dem niedrigsten Wert wird über ihr intrinsicContentSize hinaus erweitert, wenn noch Platz zum Füllen vorhanden ist

0voto

BollMose Punkte 2424

Beim Nachdenken über diese beiden Prioritäten müssen wir die Bedingungen berücksichtigen.

Wenn der Platz für zwei oder mehr Widgets ausreicht, betrachten wir die hugging priority. Die Priorität ist geringer, es wird den Überschussplatz einnehmen, und andere Widgets nehmen nur die Intrinsische Inhaltsgröße ein.

Wenn der Platz für Widgets nicht ausreicht, berücksichtigen wir auch den Content Compression Resistance.

0voto

yoAlex5 Punkte 20661

iOS AutoLayout - Inhaltsgröße und Priorität von Inhaltsumarmung und Inhaltskomprimierungswiderstand (CHCR)

[AutoLayout]

Inhaltsgröße

Inhaltsgröße -> Constraint -> AutoLayout Engine -> Zeichnen

AutoLayout verwendet die Inhaltsgröße, um implizite Einschränkungen (Breite und/oder Höhe) zu erstellen

Die Inhaltsgröße gibt an, wie viel Platz (Breite und/oder Höhe) benötigt wird, um den vollen Inhalt anzuzeigen.

Nicht alle Ansichten haben eine Inhaltsgröße

UIView und NSView - Keine eingebaute Inhaltsgröße

  • Aber tatsächlich - das UIView Objekt hat sie nicht, und die UIView Klasse hat die Variable intrinsicContentSize, die von einer Unterklasse überschrieben werden kann. Zum Beispiel hat das UILabel eine eigene Realisierung, die auf Text- und Schriftattribute basiert
  • Die Unterklasse von UIView verwendet die Standardrealisierung mit UIView.noIntrinsicMetric (-1)

Pseudocode:

import UIKit

class UIView {
   override var intrinsicContentSize: CGSize {
       return CGSize(width: UIView.noIntrinsicMetric, height: UIView.noIntrinsicMetric)
   }
}
  • Wenn Sie die intrinsicContentSize neu berechnen und neu zeichnen müssen, rufen Sie view.invalidateIntrinsicContentSize() auf

  • intrinsicContentSize vs sizeToFit(). intrinsicContentSize ist für AutoLayout, sizeToFit() ist für auf Rahmen basierende Ansichten.

    • Rufen Sie view.sizeToFit() auf
    • Überschreiben Sie view.sizeThatFits(_ size: CGSize). Die Größe ist normalerweise view.bounds.size

Priorität für Inhaltsumarmung und Inhaltskomprimierungswiderstand(CHCR)

Jede Ansicht hat eine CHCR-Priorität für jede Dimension (horizontal, vertikal), aber sie wird nur auf Ansichten mit intrinsicContentSize angewandt. Sie hat auch einen Einfluss auf die Priorität der Einschränkung

Priorität für Inhaltsumarmung(CHP)(Standardwert ist 251)

Verhindert Ausdehnung. Höhere Priorität - verhindert, dass die Ansicht größer wird als die Inhaltsgröße.

Priorität für Inhaltskomprimierungswiderstand(CRP)(Standardwert ist 750)

Verhindert Zusammenziehung. Höhere Priorität - verhindert, dass die Ansicht kleiner wird als die Inhaltsgröße.

Experimente:

Zwei UILabels (Label 1, Label 2), die horizontal nebeneinander angeordnet sind

  1. Warnung:

    Inhaltsprioritätsambiguität Verringern Sie die horizontale Umarmung...

  1. Um es mit der Priorität für Inhaltsumarmung zu reparieren

  1. Warnung:

    Inhaltsprioritätsambiguität Verringern Sie den horizontalen Kompressionswiderstand...

  1. Um es mit der Priorität für Inhaltskomprimierungswiderstand zu reparieren

  1. Wenn Sie beide Labels anzeigen möchten, können Sie eine Breiteneinschränkung verwenden, die eine höhere Priorität hat (standardmäßig 1000)

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