swift: Programmgesteuertes erstellen UILabel mit fester Breite, die Größe, die vertikal nach Textlänge
Ich habe gesehen, Antworten auf die vertikale Größenänderung beinhalten autolayout, aber die UILabel
s ich bin erstellen sind nur zur Laufzeit benötigt. (Ich muss irgendwo von null auf viele dieser Etiketten.)
Beispiele (ignorieren Sie die Farbe)
- Kurzen text (Hinweis: gleiche Breite für den längeren text):
- Längeren text (Hinweis: gleiche Breite wie kürzere text-Beispiel mit mehreren Zeilen für die add ' L text):
Wenn der text in eine Zeile passen mit fester Breite, das label sollte nicht müssen, um die Größe vertikal. Aber wenn es mehr Zeichen, sollte das Etikett weiter ausdehnen und vertikal zu passen, diese zusätzlichen Zeichen. Der text sollte halten Sie die Verpackung um eine Zeile nach Zeile. Der text sollte beginnen in der oberen linken Ecke des Etiketts.
Um genauer zu sein:
let marker = GMSMarker(position: myLatLng)
//see http://stackoverflow.com/a/40211383/1168364 for imageWithView
marker.icon = imageWithView(label) //**how do i create this label?**
marker.map = map // map is a GMSMapView
Diese Aufkleber können überall auf dem Bildschirm. Dies ist für eine map-Anwendung, wo jedes Etikett befindet sich an einer zufälligen Stelle. Die Bezeichnungen' Standorte haben keine Beziehung zu einander.
kannst du bitte überdenken Sie dies nicht als ein Duplikat? Diese Lösung scheint nicht zu funktionieren hier. Beachten Sie die Zusatz-Anforderung mit fester Breite. Vielleicht haben Sie einige Ideen, warum die Lösung unten funktioniert nicht.
Ich habe eingefahren enger Abstimmung, aber es ist immer noch ein Duplikat. Die folgende Lösung geht davon bist du mit autolayout-constraints. Meine Lösung unten ist eine alternative, es ist das aktualisieren der Rahmen manuell.
InformationsquelleAutor lf215 | 2016-11-12
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es zwei nützliche Methoden der UIView: sizeToFit() und sizeThatFits(_:)
Die erste Größe ist eine Ansicht, die eine minimale Größe zu passen, Untersichten Inhalt und die zweite nicht ändern, Rahmen, gibt aber berechnete Größe, die: (1) passen auf alle Untersichten und (2) nicht überschreitet parameter
size
So können Sie
sizeThatFits
für Sie Zweck:Ausgabe:
P. S. Sie können auch Ihr problem lösen mit autolayout-constraints, aber ich bin kein großer fan von mit Ihnen programmatisch.
InformationsquelleAutor alexburtnik
Legen Sie die Bezeichnung
numberOfLines
- Eigenschaft auf null, und fixieren Sie die Breite Ihrer Etiketten mit Einschränkungen (entweder durch Bestimmung der Breite explizit oder durch Immobilisierung der vorderen und hinteren Kanten zu irgendeiner anderen Ansicht, wie die Bezeichnung superview). Dann die Etiketten, Größe vertikal automatisch an die Höhe, passt der text. Sie müssen die pin ein label über seine top-constraint-so die Ansicht system weiß, wo zu beginnen, das layout, dann die Oberseite der alle Ihre anderen labels sollten eingeschränkt werden, um die Unterseite des vorherigen label. Auf diese Weise sind Sie alle layout-relativ zur Höhe des vorherigen label.edit in Antwort auf Ihren Kommentar:
Können Sie die Breite einer Ansicht explizit auf iOS 9 und später über die
widthAnchor
Eigenschaft. Sie können es auch auf älteren iOS-Versionen mitNSLayoutConstraints
(Suche SO Beispiele).z.B.:
label.widthAnchor.constraintEqualToConstant(50.0).active = true
Dies würde die label-Breite 50 Punkte breit, aber nicht fix in seiner Höhe, also mit
numberOfLines = 0
dann das label für die automatische Größenanpassung vertikal, wenn Sie den text festlegen.dann brauchen Sie nur um die
numberOfLines
- Eigenschaft auf null, um die dynamische Höhe (vorausgesetzt, die Breite ist fest/gebunden, ansonsten werde es nur das Layout als eine einzige lange Zeile)Ich aktualisiert meine Frage mit code. Es ist mir nicht klar, wie nur fix Breite "durch Immobilisierung die Breite explizit", wie Sie sagen. Meinst du so etwas wie dieser?
ja genau, oder mit der
widthAnchor
finden Sie unter Bearbeiten auf meine Antwort.Sie wollen wahrscheinlich eingestellt
label.translatesAutoresizingMaskIntoConstraints = false
.InformationsquelleAutor par