2016-11-12 1 views
4

Ich habe Antworten auf vertikale Größenänderung, die automatische Layout umfassen, aber die UILabel s ich erstellen werden nur zur Laufzeit benötigt. (Ich könnte überall von Null auf viele dieser Etiketten benötigen.)swift: Programmgesteuert erstellen UILabel feste Breite, die vertikal entsprechend der Textlänge ändert

Beispiele (ignorieren Sie die Farbe)

  1. Kurztext (Anmerkung gleiche Breite wie mehr Text):

enter image description here

  1. Längerer Text (gleiche Breite wie kürzeres Textbeispiel mit mehr Zeilen für zusätzlichen Text):

enter image description here

Wenn der Text in einer Zeile mit fester Breite passen, muß das Etikett sollte nicht vertikal ändern. Wenn jedoch mehr Zeichen vorhanden sind, sollte das Label vertikal erweitert werden, damit es zu diesen zusätzlichen Zeichen passt. Der Text sollte sich Zeile um Zeile weiterwickeln. Der Text sollte in der oberen linken Ecke des Etiketts beginnen.

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 Etiketten können überall auf dem Bildschirm sein. Dies ist für eine Kartenanwendung, bei der jedes Etikett an einem zufälligen Ort platziert wird. Die Standorte der Labels stehen in keiner Beziehung zueinander.

+0

Mögliche Duplikate von [Adjust UILabellenhöhe abhängig vom Text] (http://stackoverflow.com/questions/446405/adjust-uilabel-height-depending-on-the-text) – alexburtnik

+0

@alexburtnik können Sie dies bitte noch einmal überdenken als nicht ein Duplikat? Diese Lösung scheint hier nicht zu funktionieren. Beachten Sie die Additionsanforderung fester Breite. Vielleicht haben Sie einige Ideen, warum die folgende Lösung nicht funktioniert. – lf215

+0

Ich habe eine enge Abstimmung zurückgezogen, aber es ist immer noch ein Duplikat. Bei der folgenden Lösung wird davon ausgegangen, dass Sie Einschränkungen für die automatische Layouts verwenden. Meine Lösung ist eine Alternative, sie aktualisiert den Frame manuell. – alexburtnik

Antwort

6

Es gibt zwei Methoden der nützlichen UIView: sizeToFit() und sizeThatFits(_:)

Der erste, der eine im Hinblick auf eine minimale Größe ändert die Größe Subviews' Inhalt und die zweite Frame nicht ändern, überhaupt zu passen, kehrt aber berechnete Größe, die: (1) passen alle Subviews und (2) nicht überschreitet Parameter size

So können Sie verwenden sizeThatFits für Sie Zweck:

let label = UILabel() 

override func viewDidLoad() { 
    super.viewDidLoad() 

    label.backgroundColor = UIColor.orange 
    label.textColor = UIColor.white 
// label.text = "ultimate Frisbee" 
    label.text = "ultimate Frisbee\nin 3 minutes,\nall welcome|2" 
    label.numberOfLines = 10 
    view.addSubview(label) 

    updateLabelFrame() 
} 

func updateLabelFrame() { 
    let maxSize = CGSize(width: 150, height: 300) 
    let size = label.sizeThatFits(maxSize) 
    label.frame = CGRect(origin: CGPoint(x: 100, y: 100), size: size) 
} 

Ausgang:

enter image description here enter image description here

P. S. Sie können auch Ihr Problem mit automatischen Layout-Einschränkungen lösen, aber ich bin kein großer Fan davon, sie programmatisch zu verwenden.

1

Setzen Sie die Eigenschaft numberOfLines des Labels auf Null und fixieren Sie die Breite Ihrer Beschriftungen mit Constraints (entweder durch explizite Begrenzung der Breite oder durch Beschränkung der Vorder- und Hinterkante auf eine andere Ansicht wie die Superview der Beschriftung). Dann werden die Beschriftungen automatisch vertikal auf die Höhe angepasst, die zum Text passt. Sie müssen ein Label über seine oberste Einschränkung festlegen, damit das Ansichtssystem weiß, wo das Layout zu starten ist. Dann sollte der obere Rand aller anderen Labels auf den unteren Rand des vorherigen Labels beschränkt werden. Auf diese Weise werden alle Layouts relativ zur Höhe des vorherigen Labels angezeigt.

bearbeiten als Antwort auf Ihren Kommentar:

Sie die Breite der Ansicht explizit auf iOS 9 und später unter Verwendung der widthAnchor Eigenschaft einstellen. Sie können es für ältere iOS-Versionen unter Verwendung von NSLayoutConstraints festlegen (suchen Sie nach SO für Beispiele).

z.B .:

label.widthAnchor.constraintEqualToConstant(50.0).active = true

Dies würde die Beschriftung der Breite auf 50 Punkte breit eingestellt, aber nicht seine Höhe beheben, so mit numberOfLines = 0 dann dem Etikett vertikal Auto-Größe ändern, wenn Sie den Text gesetzt.

+0

Die Positionen meiner Labels haben keine Beziehung zueinander – lf215

+0

@ lf215 Dann müssen Sie nur die 'numberOfLines' -Eigenschaft auf Null setzen, um dynamische Höhe zu erhalten (vorausgesetzt, die Breite ist fest/beschränkt, sonst wird es nur als eine lange ausgelegt Linie) – par

+0

Ich habe meine Frage mit Code aktualisiert. Es ist mir nicht klar, wie man die Breite nur "durch explizite Begrenzung der Breite" festlegen kann, wie Sie sagen. Meinst du sowas wie [das] (http://stackoverflow.com/a/27682006/1168364)? – lf215

Verwandte Themen