Ich kann aus Liebe zu Gott nicht den Dreh raus haben.
Ich habe eine UIView *superview
mit 4 UILabels
. 2 fungieren als Header für die 2 anderen.
Der Inhalt in allen 4 ist dynamisch und stammt aus der Datenbank.
SizeToFit
vs SizeThatFits:(CGSize)
vs UIView systemLayoutSizeFittingSize:
, entweder UILayoutFittingCompressedSize
oder vorbei UILayoutFittingExpandedSize
.
Ich verwende Autolayout programmgesteuert und habe die Höhe der Überwachungsansicht so eingestellt, dass sie einer Dummy-Zahl entspricht oder größer ist.
wo und wie verwende ich diese SizeToFit
vs sizeThatFits:(CGSize)
vs UIView systemLayoutSizeFittingSize:
, entweder UILayoutFittingCompressedSize
oder UILayoutFittingExpandedSize
. Ich habe hier auf Stack viele Tipps gelesen, aber am Ende nichts.
MUSS ich die Einschränkungen für die Übersicht an einem bestimmten Ort neu berechnen? Maby setzt die Höhe in seiner Controller-Klasse auf "@ property" und entfernt und liest sie? Atm Ich habe versucht, alles überall und noch mehr zu platzieren. Trotzdem erhalte ich das gleiche Endergebnis, wenn die Dummy-Höhe und der Text nach außen schweben. Auch nach dem Setzen von clipsToBound in der Unteransicht.
Ich kratzte mir die Haare von ... Hilfe
quelle
Antworten:
Wenn Sie das automatische Layout verwenden, müssen Sie Folgendes tun:
Stellen Sie sicher, dass Sie keiner Ihrer Unteransichten feste Breiten- und / oder Höhenbeschränkungen hinzufügen (abhängig davon, welche Dimension (en) Sie dynamisch anpassen möchten). Die Idee ist, die intrinsische Inhaltsgröße jeder Unteransicht die Höhe der Unteransicht bestimmen zu lassen.
UILabel
s werden mit 4 automatischen impliziten Einschränkungen geliefert, die (mit weniger als der erforderlichen Priorität) versuchen, den Rahmen des Etiketts auf der exakten Größe zu halten, die erforderlich ist, um den gesamten Text darin aufzunehmen.Stellen Sie sicher, dass die Kanten jedes Etiketts fest (mit Einschränkungen für die erforderliche Priorität) mit den Kanten voneinander und ihrer Übersicht verbunden sind. Sie möchten sicherstellen, dass, wenn Sie sich vorstellen, dass eines der Labels größer wird, dies die anderen Labels dazu zwingt, Platz dafür zu schaffen, und vor allem, dass die Übersicht ebenfalls erweitert wird.
Fügen Sie der Übersicht nur Einschränkungen hinzu, um ihre Position und nicht ihre Größe festzulegen (zumindest nicht für die Dimension (en), deren Größe dynamisch sein soll). Denken Sie daran, dass bei korrekter Einrichtung der internen Einschränkungen die Größe durch die Größe aller Unteransichten bestimmt wird, da die Kanten in gewisser Weise mit ihren verbunden sind.
Das ist es. Sie müssen nicht anrufen
sizeToFit
odersystemLayoutSizeFittingSize:
dies zum Laufen bringen, laden Sie einfach Ihre Ansichten und legen Sie den Text fest, und das sollte es sein. Die Systemlayout-Engine führt die Berechnungen für Sie durch, um Ihre Einschränkungen zu lösen. (Wenn überhaupt, müssen Sie möglicherweisesetNeedsLayout
die Übersicht aufrufen ... dies sollte jedoch nicht erforderlich sein.)quelle
constraintsWithVisualFormat
und ich verstehe Ihre Meinung zu den enthaltenen Unteransichten, die sich dehnen und die Übersicht auf ihre Größe verschieben :)translatesAutoresizingMaskIntoConstraints = NO
ob Sie xib verwenden.Verwenden Sie Containeransichten
Im folgenden Beispiel habe ich ein 30x30-Bild und das
UILabel
ist kleiner als die enthaltende Ansicht mit dem Platzhaltertext. Ich brauchte, dass die enthaltende Ansicht mindestens so groß wie das Bild war, aber sie musste vergrößert werden, um mehrzeiligen Text zu enthalten.Im visuellen Format sieht der innere Container folgendermaßen aus:
Stellen Sie dann die enthaltende Ansicht so ein, dass sie der Höhe des Etiketts entspricht. Jetzt enthält die enthaltende Ansicht die Größe des Etiketts.
Wie @smileyborg in seiner Antwort hervorhob, informiert das starre Verbinden des Inhalts mit der Übersicht die Layout-Engine darüber, dass die einfache Containeransicht dazu führen sollte, dass er wächst.
Gelbe Ausrichtungsrechtecke
Wenn Sie möchten, dass die gelben Ausrichtungsrechtecke
-UIViewShowAlignmentRects YES
in die Liste der Ausführungsargumente Ihres Schemas aufgenommen werden.quelle
-UIViewShowAlignmentRects YES
- toller Tipp!Dies wurde durch die Einführung von Stapelansichten in iOS 9 erheblich vereinfacht. Verwenden Sie eine Stapelansicht in Ihrer Ansicht, um alle Inhalte zu enthalten, deren Größe geändert wird, und rufen Sie dann einfach auf
nach dem Ändern Ihres Inhalts. Dann können Sie Ihre neue Größe erhalten, indem Sie anrufen
Wenn Sie jemals die genaue Größe berechnen müssen, die für eine Ansicht erforderlich ist.
quelle
Dies folgt fast der Antwort von @smileyborg und enthält ein konkretes Beispiel.
Beschreibt nicht alle Einschränkungen, sondern diejenigen, die sich auf die Berechnung der Höhe von UI-Objekten beziehen.
height
Einschränkung haben. In diesem Fall ändert AutoLayout die Größe der Beschriftungen nicht an den Text. Daher ist das Festlegen von Kantenbeschränkungen der Schlüssel. (grüne Pfeile)[Unteransicht] Die Schritte 1 und 3 sind sehr einfach zu befolgen, aber dieser Schritt kann missverstanden werden. Wie bei Beschriftungen dürfen für Unteransichten keine
height
Einschränkungen festgelegt sein. Für alle Unteransichten muss einetop
Einschränkung festgelegt sein, wobei diebottom
Einschränkung ignoriert wird. Dies kann zu der Annahme führen , dass zur Laufzeit eine nichtbottom
erfüllte Einschränkungsausnahme ausgelöst wird. Dies ist jedoch nicht der Fall, wenn Sie eine Einschränkung für die letzte Unteransicht festlegen. Wenn Sie dies nicht tun, wird das Layout zerstört. (rote Pfeile)[Übersicht] Stellen Sie alle Einschränkungen so ein, wie Sie es benötigen, aber achten Sie besonders auf die
height
Einschränkung. Weisen Sie ihm einen zufälligen Wert zu, machen Sie ihn jedoch optional. AutoLayout stellt die Höhe genau so ein, dass sie zu den Unteransichten passt. (blaue Pfeile)Dies funktioniert einwandfrei, es müssen keine zusätzlichen Methoden zur Aktualisierung des Systemlayouts aufgerufen werden.
quelle