Wie kann man UILabel dazu bringen, die Größe besser zu ändern?
Ich versuche , meine mehrzeilige zu machen , UILabel
so 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: Das 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*50
mir 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 sizeThatFits
gibt 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?
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.