Próbuję obliczyć wysokość UILabel na podstawie różnych długości ciągu.
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
}
Powyżej znajduje się bieżąca funkcja, której używam do określenia wysokości, ale nie działa. Byłbym bardzo wdzięczny za każdą pomoc, którą mogę uzyskać. Odpowiedziałbym na pytanie w Szybkim, a nie w Celu C.
Odpowiedzi:
Użyj rozszerzenia na
String
Szybki 3
a także na
NSAttributedString
(co czasami jest bardzo przydatne)Szybki 4
Po prostu zmień wartość
attributes
wextension String
metodachz
do
źródło
[NSFontAttributeName: font, NSLineBreakMode: .ByWordWrapping]
ale to nie zadziałałoNSParagraphStyleAttributeName : style
styl to NSMutableParagraphStylesizeForItemAtIndexPath
w sposóbUICollectionView
jest to, że wydaje się, aby zastąpić powrót doinsetForSectionAt
W przypadku tekstu wielowierszowego ta odpowiedź nie działa poprawnie. Możesz zbudować inne rozszerzenie String za pomocą UILabel
UILabel otrzymuje stałą szerokość, a .numberOfLines jest ustawiony na 0. Po dodaniu tekstu i wywołaniu .sizeToFit () automatycznie dostosowuje się do właściwej wysokości.
Kod jest napisany w Swift 3 🔶🐦
źródło
sizeToFit
Oto proste rozwiązanie, które działa dla mnie ... podobnie jak niektóre inne opublikowane, ale nie obejmuje potrzeby dzwonienia
sizeToFit
Pamiętaj, że jest to napisane w Swift 5
To obsługuje owijanie linii i tym podobne. Nie jest to najbardziej elegancki kod, ale wykonuje zadanie.
źródło
źródło
Oto moja odpowiedź w Swift 4.1 i Xcode 9.4.1
Teraz wywołujesz tę funkcję
źródło
Odkryłem, że zaakceptowana odpowiedź działała dla stałej szerokości, ale nie dla stałej wysokości. W przypadku stałej wysokości zwiększyłoby szerokość, aby dopasować wszystko do jednego wiersza, chyba że w tekście występował podział linii.
Funkcja width wywołuje funkcję wysokości wiele razy, ale jest to szybkie obliczenie i nie zauważyłem problemów z wydajnością podczas używania funkcji w wierszach UITable.
źródło
minimumTextWrapWidth:CGFloat
?Sprawdź wysokość tekstu etykiety i na nim działa
źródło
To rozwiązanie pomoże obliczyć wysokość i szerokość w czasie wykonywania.
Tutaj możesz obliczyć szacunkową wysokość, jaką wziąłby Twój łańcuch i przekazać go do ramy UILabel.
źródło
Swift 5:
Jeśli masz UILabel, a jakaś funkcja ograniczania nie działa dla ciebie (napotkałem ten problem. Zawsze zwracała 1 linię wysokości), istnieje rozszerzenie ułatwiające obliczenie rozmiaru etykiety.
Możesz użyć tego w następujący sposób:
Pracuje dla mnie
źródło
źródło