Wenn Sie eine mehrzeilige Beschriftung (mit Zeilenumbruch auf Zeilenumbruch gesetzt) in eine Stapelansicht einfügen, verliert die Beschriftung sofort den Zeilenumbruch und zeigt den Beschriftungstext stattdessen in einer Zeile an.
Warum passiert das und wie behält man ein mehrzeiliges Etikett in einer Stapelansicht bei?
Antworten:
Die richtige Antwort finden Sie hier:
https://stackoverflow.com/a/43110590/566360
UILabel
Innere einUIView
(Editor -> Einbetten -> Ansicht)UILabel
an dieUIView
anzupassen (z. B. nachfolgender Bereich, oberer Bereich und führender Bereich, um Einschränkungen zu überwachen).Das
UIStackView
wird das ausdehnen,UIView
um richtig zu passen, und dasUIView
wird dasUILabel
auf mehrere Linien beschränken.quelle
UIView
Spielereien nötig.Für eine horizontale Stapelansicht
UILabel
mit einer ihrer Ansichten wird zunächst im Interface Builder festgelegtlabel.numberOfLines = 0
. Dies sollte ermöglichen, dass das Etikett mehr als eine Zeile enthält. Dies funktionierte anfangs nicht für mich, als die Stapelansicht hattestackView.alignment = .fill
. Damit es funktioniert, einfach einstellenstackView.alignment = .center
. Die Beschriftung kann jetzt auf mehrere Zeilen innerhalb der Beschriftung erweitert werdenUIStackView
.Die Apple-Dokumentation sagt
Beachten Sie das Wort außer hier. Bei
.fill
VerwendungUIStackView
ändert sich die Größe der Horizontalen NICHT vertikal unter Verwendung der angeordneten Größen der Unteransichten.quelle
.alignment
von der UIStackView , dass Sie Satz zu etwas haben , aber.fill
nicht die UILabel, die ein wenig in dem gegebenen Beispiel verwirrend istlabel.alignment = .center
. Ich denke, das sollte seinstackView.alignment = .center
multiLine
wenn Sie ihr eine feste Breite geben. Wenn wir seine Breite festlegen, wird es mehrzeilig, wenn diese Breite wie gezeigt erreicht ist:Wenn wir der Stapelansicht keine feste Breite geben, werden die Dinge mehrdeutig. Wie lange wächst die Stapelansicht mit dem Etikett (wenn der Etikettenwert dynamisch ist)?
Hoffe, dies kann Ihr Problem beheben.
quelle
preferredMaxLayoutWidth
inviewDidLayoutSubviews
für das Etikett inUIViewController
oder in ,layoutSubviews
wenn Sie eine UnterklasseUIView
.Das Setzen von PreferredMaxLayoutWidth auf das UILabel hat bei mir funktioniert
quelle
.center
und ich brauchte mein Label in UIView wirklich nicht.Setzen Sie einfach die Anzahl der Zeilen im Attributinspektor für die Beschriftung auf 0. Es wird für Sie funktionieren.
quelle
Nachdem ich alle oben genannten Vorschläge ausprobiert hatte, stellte ich fest, dass für UIStackView keine Änderung der Eigenschaften erforderlich ist. Ich ändere nur die Eigenschaften der UILabels wie folgt (Die Beschriftungen sind bereits einer vertikalen Stapelansicht hinzugefügt):
Swift 4 Beispiel:
quelle
Der Zaubertrick für mich war, einen
widthAnchor
auf den zu setzenUIStackView
.Einstellung
leadingAnchor
undtrailingAnchor
funktioniert nicht, aber EinstellungcenterXAnchor
undwidthAnchor
korrekte Anzeige des UILabel.quelle
iOS 9+
Rufen Sie an,
[textLabel sizeToFit]
nachdem Sie den Text des UILabels festgelegt haben.sizeToFit gestaltet das mehrzeilige Etikett mit PreferredMaxWidth neu. Die Größe der Beschriftung ändert die Größe der Stapelansicht, wodurch die Größe der Zelle geändert wird. Neben dem Anheften der Stapelansicht an die Inhaltsansicht sind keine zusätzlichen Einschränkungen erforderlich.
quelle
Hier ist ein vollständiges Beispiel für eine Vertikale
UIStackView
, die aus mehrzeiligenUILabel
s mit automatischer Höhe besteht.Der Etikettenumbruch basiert auf der Breite der Stapelansicht und die Höhe der Stapelansicht basiert auf der Umbruchhöhe des Etiketts. (Bei diesem Ansatz müssen Sie die Beschriftungen nicht in a einbetten
UIView
.) (Swift 5, iOS 12.2)Hier ist ein Beispiel
ViewController
, das es verwendet.quelle
Das Folgende ist eine Playground-Implementierung eines mehrzeiligen Etiketts mit einem Zeilenumbruch innerhalb von a
UIStackView
. Es erfordert keine Einbettung desUILabel
Inneren und wurde mit Xcode 9.2 und Swift 4 getestet. Ich hoffe, es ist hilfreich.quelle
UIStackView
Eigenschaften hinzufügen ,Anstatt eine Beschriftung hinzuzufügen,
UIView
die nicht erforderlich ist. Wenn Sie eine Beschriftung verwendenUITableViewCell
, laden Sie die Daten bei der Drehung neu.quelle
Das Systemlayout sollte Ursprung, Breite und Höhe ermitteln, um Unteransichten zu zeichnen. In diesem Fall haben alle Ihre Unteransichten die gleiche Priorität. Dieser Punkt führt zu Konflikten. Das Layoutsystem kennt keine Abhängigkeiten zwischen Ansichten, die zuerst, zweitens usw. gezeichnet werden
Durch die Komprimierung der Stapel-Unteransichten wird das Problem mit mehreren Zeilen gelöst, je nachdem, ob Ihre Stapelansicht horizontal oder vertikal ist und welche mehrere Zeilen werden sollen.
stackOtherSubviews .setContentCompressionResistancePriority(.defaultHight, for: .horizontal)
lblTitle.setContentCompressionResistancePriority(.defaultLow, for: .horizontal)
quelle
In meinem Fall folgte ich den vorherigen Vorschlägen, aber mein Text wurde immer noch auf eine einzelne Zeile gekürzt, allerdings nur im Querformat. Es stellte sich heraus, dass ich
\0
im Text des Etiketts ein unsichtbares Nullzeichen gefunden habe, das der Schuldige war. Es muss neben dem von mir eingefügten em-Strichsymbol eingefügt worden sein. Um festzustellen, ob dies auch in Ihrem Fall der Fall ist, wählen Sie mit dem View Debugger Ihr Etikett aus und überprüfen Sie dessen Text.quelle
Xcode 9.2:
Setzen Sie einfach die Anzahl der Zeilen auf 0. Das Storyboard sieht nach dem Einstellen seltsam aus. Mach dir keine Sorgen, führe das Projekt aus. Während der Ausführung wird die Größe aller Elemente entsprechend Ihrem Storyboard-Setup geändert. Ich denke, es ist eine Art Fehler im Storyboard.
Tipps: Setzen Sie im letzten "Anzahl der Liner auf 0". Setzen Sie es zurück, wenn Sie eine andere Ansicht bearbeiten möchten, und setzen Sie es nach der Bearbeitung auf 0.
quelle
Was hat bei mir funktioniert!
Stapelansicht: Ausrichtung: Füllung, Verteilung: Füllung, Einschränkung der proportionalen Breite zur Übersicht ex. 0,8,
label: center und lines = 0
quelle
Für alle, die es immer noch nicht zum Laufen bringen können. Versuchen Sie, Autoshrink mit einer minimalen Schriftskala für dieses UILabel festzulegen.
Screenshot UILabel Autoshrink-Einstellungen
quelle
Es ist fast wie bei @ Andy's Answer, aber Sie können Ihre
UILabel
zusätzlicheUIStackview
, vertikale Arbeit für mich hinzufügen .quelle
Für mich war das Problem, dass die Höhe der Stapelansicht einfach zu kurz war. Das Etikett und die Stapelansicht wurden ordnungsgemäß eingerichtet, damit das Etikett mehrere Zeilen haben kann. Das Etikett war jedoch das erste Opfer der Inhaltskomprimierung, mit der die Stapelansicht ihre Höhe klein genug machte.
quelle