Mein Verständnis von Autolayout ist, dass es die Größe der Übersicht verwendet und auf Einschränkungen und intrinsischen Größen basiert, die Positionen von Unteransichten berechnen.
Gibt es eine Möglichkeit, diesen Prozess umzukehren? Ich möchte die Größe der Übersicht auf der Grundlage von Einschränkungen und Eigengrößen ändern. Was ist der einfachste Weg, dies zu erreichen?
Ich habe eine in Xcode entworfene Ansicht, für die ich sie als Header verwende UITableView
. Diese Ansicht enthält eine Beschriftung und eine Schaltfläche. Die Größe des Etiketts hängt von den Daten ab. Abhängig von den Einschränkungen drückt das Etikett die Schaltfläche erfolgreich nach unten, oder wenn zwischen der Schaltfläche und dem unteren Rand der Übersicht eine Einschränkung besteht, wird das Etikett komprimiert.
Ich habe einige ähnliche Fragen gefunden, aber sie haben keine guten und einfachen Antworten.
Antworten:
Die richtige API ist
UIView systemLayoutSizeFittingSize:
, entwederUILayoutFittingCompressedSize
oder zu übergebenUILayoutFittingExpandedSize
.Bei einer normalen
UIView
Verwendung von Autolayout sollte dies nur funktionieren, solange Ihre Einschränkungen korrekt sind. Wenn Sie es für a verwenden möchtenUITableViewCell
(um beispielsweise die Zeilenhöhe zu bestimmen), sollten Sie es gegen Ihre Zelle aufrufencontentView
und die Höhe ermitteln.Weitere Überlegungen bestehen, wenn Sie ein oder mehrere UILabels in Ihrer Ansicht haben, die mehrzeilig sind. Für diese ist es unbedingt erforderlich, dass die
preferredMaxLayoutWidth
Eigenschaft korrekt festgelegt wird, sodass die Beschriftung eine korrekte Eigenschaft enthältintrinsicContentSize
, die bei dersystemLayoutSizeFittingSize's
Berechnung verwendet wird.BEARBEITEN: Auf Anfrage wird ein Beispiel für die Höhenberechnung für eine Tabellenansichtszelle hinzugefügt
Die Verwendung von Autolayout für die Berechnung der Tabellenzellenhöhe ist nicht sehr effizient, aber sicher praktisch, insbesondere wenn Sie eine Zelle mit einem komplexen Layout haben.
Wie oben erwähnt, ist es bei Verwendung einer mehrzeiligen
UILabel
Datei unbedingt erforderlich, diepreferredMaxLayoutWidth
mit der Etikettenbreite zu synchronisieren . Ich benutze dazu eine benutzerdefinierteUILabel
Unterklasse:Hier ist eine erfundene UITableViewController-Unterklasse, die heightForRowAtIndexPath demonstriert:
Eine einfache benutzerdefinierte Zelle:
Und hier ist ein Bild der im Storyboard definierten Einschränkungen. Beachten Sie, dass das Etikett keine Höhen- / Breitenbeschränkungen enthält. Diese werden aus den folgenden Angaben abgeleitet
intrinsicContentSize
:quelle
sizingCell
oder gegen diecontentView
.sizingCell
Breite mit Ihrer Breite übereinstimmttableView
.Der Kommentar von Eric Baker hat mich auf die Kernidee hingewiesen, dass der Inhalt einer Ansicht eine explizite Beziehung zur enthaltenen Ansicht haben muss, damit ihre Größe durch den darin enthaltenen Inhalt bestimmt wird, um ihre Höhe zu bestimmen (oder Breite) dynamisch . "Unteransicht hinzufügen" erstellt diese Beziehung nicht, wie Sie vielleicht annehmen. Sie müssen auswählen, welche Unteransicht die Höhe und / oder Breite des Containers bestimmen soll ... am häufigsten das UI-Element, das Sie in der unteren rechten Ecke Ihrer gesamten UI platziert haben. Hier sind einige Code- und Inline-Kommentare, um den Punkt zu veranschaulichen.
Beachten Sie, dass dies für diejenigen, die mit Bildlaufansichten arbeiten, von besonderem Wert sein kann, da es üblich ist, eine einzelne Inhaltsansicht zu entwerfen, die ihre Größe dynamisch bestimmt (und dies der Bildlaufansicht mitteilt), basierend auf dem, was Sie darin eingeben. Viel Glück, hoffe das hilft jemandem da draußen.
quelle
Sie können dies tun, indem Sie eine Einschränkung erstellen und über den Interface Builder verbinden
Siehe Erklärung: Auto_Layout_Constraints_in_Interface_Builder
raywenderlich Anfang-Auto-Layout
AutolayoutPG Artikel beschränken die Grundlagen
Verbinden Sie diesen Constraint-Ausgang mit Ihren Unteransichten. Constraint oder verbinden Sie auch Super Views Constraint und stellen Sie ihn entsprechend Ihren Anforderungen ein
Ich hoffe das klärt es.
quelle
Dies kann für ein normales
subview
in einem größeren gemacht werdenUIView
, aber es funktioniert nicht automatisch fürheaderViews
. Die Höhe von aheaderView
wird durch die Rückgabe von bestimmt.tableView:heightForHeaderInSection:
Sie müssen alsoheight
die Höheheight
desUILabel
Plus-Platzes für dieUIButton
und die vonpadding
Ihnen benötigten berechnen . Sie müssen so etwas tun:Hier
headerString
ist die Zeichenfolge, die Sie füllen möchtenUILabel
, und die Nummer 281 ist diewidth
derUILabel
(wie in eingerichtetInterface Builder
).quelle