Obwohl die Frage programmgesteuert lautet, nachdem ich auf dasselbe Problem gestoßen bin und lieber in Interface Builder arbeite, hielt ich es für nützlich, die vorhandenen Antworten mit einer Interface Builder-Lösung zu ergänzen.
Das erste ist zu vergessen sizeToFit
. Das automatische Layout übernimmt dies in Ihrem Namen basierend auf der Größe des Inhalts.
Das Problem ist daher, wie ein Etikett mit dem automatischen Layout an den Inhalt angepasst werden kann. Insbesondere - weil die Frage es erwähnt - Höhe. Beachten Sie, dass für die Breite dieselben Prinzipien gelten.
Beginnen wir also mit einem Beispiel für UILabel, dessen Höhe auf 41 Pixel hoch eingestellt ist:
Wie Sie oben auf dem Bildschirm sehen können, "This is my text"
ist oben und unten eine Polsterung vorhanden. Das ist ein Auffüllen zwischen der Höhe des UILabels und seinem Inhalt, dem Text.
Wenn wir die App im Simulator ausführen, sehen wir sicher dasselbe:
Wählen Sie nun das UILabel im Interface Builder aus und sehen Sie sich die Standardeinstellungen im Größeninspektor an:
Beachten Sie die oben hervorgehobene Einschränkung. Das ist die Priorität von Content Hugging . Wie Erica Sadun es im ausgezeichneten iOS Auto Layout Demystified beschreibt , ist dies:
Die Art und Weise, wie eine Ansicht es bevorzugt, zusätzliche Auffüllungen um ihren Kerninhalt zu vermeiden
Für uns mit dem UILabel ist der Text der Kerninhalt.
Hier kommen wir zum Kern dieses Grundszenarios. Wir haben unserer Textbezeichnung zwei Einschränkungen gegeben. Sie widersprechen sich. Man sagt "die Höhe muss gleich 41 Pixel hoch sein" . Der andere sagt „hug den Blick auf seinen Inhalt , so dass wir keine zusätzliche Polsterung haben“ . In unserem Fall sollten Sie die Ansicht an den Text anpassen, damit wir keine zusätzliche Polsterung haben.
Bei Auto Layout mit zwei verschiedenen Anweisungen, die unterschiedliche Aufgaben ausführen, muss die Laufzeit nun die eine oder andere auswählen. Es kann nicht beides. Das UILabel kann nicht beide 41 Pixel hoch sein und hat keine Polsterung.
Die Lösung erfolgt durch Angabe der Priorität. Ein Befehl muss eine höhere Priorität haben als der andere. Wenn beide Anweisungen unterschiedliche Aussagen machen und dieselbe Priorität haben, tritt eine Ausnahme auf.
Also lass es uns versuchen. Meine Höhenbeschränkung hat eine Priorität von 1000 , was erforderlich ist . Die Höhe des Inhalts beträgt 250 , was schwach ist . Was passiert, wenn wir die Priorität der Höhenbeschränkung auf 249 reduzieren ?
Jetzt können wir sehen, wie die Magie beginnt. Versuchen wir es in der Sim:
Genial! Content Hugging erreicht. Nur weil die Höhenpriorität 249 geringer ist als die Inhaltspriorität 250 . Grundsätzlich sage ich: "Die Höhe, die ich hier spezifiziere, ist weniger wichtig als die, die ich für das Umarmen von Inhalten angegeben habe . " So gewinnt der Inhalt, der umarmt.
Unter dem Strich kann das Anpassen der Beschriftung an den Text so einfach sein wie das Festlegen der Höhen- oder Breitenbeschränkung und das korrekte Festlegen dieser Priorität in Verbindung mit der inhaltlichen Prioritätsbeschränkung dieser Achse.
Wird das Äquivalent für Breite als Übung für den Leser tun!
label.sizeToFit()
in Xcode / viewController verwenden, die Einschränkungen waren genug. hat das Label nicht in Playground erstellt . Bisher habe ich es nur auf dem Spielplatz gefundenlabel.sizeToFit()