Ich versuche, die Höhe eines UILabel basierend auf verschiedenen Stringlängen zu berechnen.
func calculateContentHeight() -> CGFloat{
var maxLabelSize: CGSize = CGSizeMake(frame.size.width - 48, CGFloat(9999))
var contentNSString = contentText as NSString
var expectedLabelSize = contentNSString.boundingRectWithSize(maxLabelSize, options: NSStringDrawingOptions.UsesLineFragmentOrigin, attributes: [NSFontAttributeName: UIFont.systemFontOfSize(16.0)], context: nil)
print("\(expectedLabelSize)")
return expectedLabelSize.size.height
}
Oben ist die aktuelle Funktion, mit der ich die Höhe bestimme, aber sie funktioniert nicht. Ich würde mich sehr über jede Hilfe freuen, die ich bekommen kann. Ich würde die Antwort in Swift und nicht in Objective C bevorzugen.
Antworten:
Verwenden Sie eine Erweiterung für
String
Swift 3
und auch auf
NSAttributedString
(was manchmal sehr nützlich ist)Swift 4
Ändern Sie einfach den Wert für
attributes
in denextension String
Methodenvon
zu
quelle
[NSFontAttributeName: font, NSLineBreakMode: .ByWordWrapping]
aber es hat nicht funktioniertNSParagraphStyleAttributeName : style
wo Stil ist NSMutableParagraphStylesizeForItemAtIndexPath
a verwendete,UICollectionView
ist, dass sie die Rückkehr fürinsetForSectionAt
Bei mehrzeiligem Text funktioniert diese Antwort nicht richtig. Sie können mit UILabel eine andere String-Erweiterung erstellen
Das UILabel erhält eine feste Breite und die .numberOfLines wird auf 0 gesetzt. Durch Hinzufügen des Texts und Aufrufen von .sizeToFit () wird automatisch die richtige Höhe angepasst.
Code ist in Swift 3 🔶🐦 geschrieben
quelle
sizeToFit
Hier ist eine einfache Lösung, die für mich funktioniert ... ähnlich wie einige der anderen, aber sie beinhaltet nicht die Notwendigkeit eines Anrufs
sizeToFit
Beachten Sie, dass dies in Swift 5 geschrieben ist
Dies behandelt Zeilenumbrüche und dergleichen. Nicht der eleganteste Code, aber er erledigt den Job.
quelle
quelle
Dies ist meine Antwort in Swift 4.1 und Xcode 9.4.1
Jetzt rufen Sie diese Funktion auf
quelle
Ich fand heraus, dass die akzeptierte Antwort für eine feste Breite, aber nicht für eine feste Höhe funktionierte. Bei einer festen Höhe würde nur die Breite vergrößert, um alles in eine Zeile zu passen, es sei denn, der Text enthält einen Zeilenumbruch.
Die width-Funktion ruft die height-Funktion mehrmals auf, ist jedoch eine schnelle Berechnung, und ich habe keine Leistungsprobleme bei der Verwendung der Funktion in den Zeilen einer UITable festgestellt.
quelle
minimumTextWrapWidth:CGFloat
?Überprüfen Sie die Höhe des Etikettentextes und es wird daran gearbeitet
quelle
Diese Lösung hilft bei der Berechnung der Höhe und Breite zur Laufzeit.
Hier können Sie die geschätzte Höhe berechnen, die Ihre Zeichenfolge annehmen würde, und sie an den UILabel-Frame übergeben.
quelle
Swift 5:
Wenn Sie UILabel haben und BoundingRect für Sie nicht funktioniert (ich hatte dieses Problem. Es wurde immer 1 Zeilenhöhe zurückgegeben.), Gibt es eine Erweiterung, mit der Sie die Etikettengröße einfach berechnen können.
Sie können es so verwenden:
Funktioniert bei mir
quelle
quelle