Wie kann man UILabel dazu bringen, die Größe besser zu ändern?


Sti

Ich versuche , meine mehrzeilige zu machen , UILabelso klein wie möglich mit max-width gegeben, aber die sizeToFit()und sizeThatFits(_,_)Methoden gibt nicht die Ergebnisse , die ich will.

Schauen Sie sich dieses Bild an: Geben Sie hier die Bildbeschreibung einDas rote Rechteck repräsentiert die Breite, die ich eingebe sizeThatFits(während die Höhe Max ist). Wie Sie sehen können, gibt diese Methode zwar tatsächlich eine Größe zurück, die passt , aber sie gibt mir nicht die kleinstmögliche Größe, die ich möchte.

Nehmen wir an, ich habe angegeben max-width: 300. Dieses tatsächliche Ergebnis gibt mir eine Größe von ca. 280*50. Wie Sie auf dem Bild sehen können, ist der Text jetzt folgendermaßen geschrieben:

Here is some text that is supposed to
align nicely

Was ich erreichen möchte, ist Folgendes:

Here is some text that is
supposed to align nicely

Dieses Ergebnis hätte die gleiche Höhe, aber eine viel kleinere Breite gehabt, z. B. ist 200*50mir klar, dass es schwierig ist, "kleinstmögliche Größe" zu definieren, da dies Folgendes zurückgeben könnte:

Here
is
some
text
that
...

Oder auch nur ein Buchstabe pro Zeile. Aber da sizeThatFitsgibt dieses mit einer bestimmten Breite und Höhe, warum es nicht mein wollte Ergebnis zurück, das die gleiche Höhe, aber mit geringerer Breite . Warum wird die kleinste Passform nicht zurückgegeben? Gibt es eine solche Funktion?

Sti

Ich habe meine eigene Lösung gemacht, die ziemlich gut funktioniert:

private func calculateWantedSize(label:UILabel)->CGSize{
    var lastAcceptableWidth = label.bounds.width
    let currentHeight = label.sizeThatFits(CGSize(width: label.bounds.width, height: CGFloat.max)).height

    var tempHeight = currentHeight
    while(tempHeight == currentHeight){
        let newWidth = lastAcceptableWidth - 1
        tempHeight = label.sizeThatFits(CGSize(width: newWidth, height: CGFloat.max)).height
        if tempHeight == currentHeight{
            lastAcceptableWidth = newWidth
        }
    }
    return CGSize(width: lastAcceptableWidth, height: label.bounds.height)
}

Hier sende ich mein Etikett an eine Funktion, die zuerst die aktuelle Breite und Höhe des Etiketts berechnet, dann die Breite 1 durchläuft und die resultierende Höhe überprüft, bis die Höhe geändert wird. Die Höhe ändert sich, wenn die Breite so gering ist, dass eine neue Linie benötigt wird. In diesem Fall gebe ich die letzte gültige Breite zurück, die noch dieselbe Höhe wie das Original benötigt.

Dies ist perfekt für mein Problem, indem ich zugeschriebenen Text usw. verwende.

Wenn Sie dies verwenden, müssen Sie natürlich einige Überprüfungen durchführen, bevor Sie anrufen. Ich weiß nicht, was passieren wird, wenn Sie diese Funktion verwenden, wenn das Etikett ein einzelnes Wort oder einen einzelnen Buchstaben oder überhaupt keinen Text enthält. Ich habe dies nur für die Fälle getestet, von denen ich weiß, dass sie mit dieser App auftreten werden, und sie funktioniert gut.

Verwandte Artikel


Wie kann man Gitterquadrate dazu bringen, die Farbe zu ändern?

shar27 Ich bin noch ein Anfänger und versuche zu verstehen, wie ich die Rasterfarben für mein Etch-a-Sketch-Projekt ändern kann. Eine Anleitung wäre wunderbar. Ich kann die Farbe des Hintergrunds der Seite ändern, ich kann auch die Farbe des Rasterrahmens ände