Mam kilka etykiet, które chcę dopasować ich wysokość do tekstu, to jest kod, który teraz napisałem
func heightForView(text:String, font:UIFont, width:CGFloat) -> CGFloat{
let label:UILabel = UILabel(frame: CGRectMake(0, 0, width, CGFloat.max))
label.numberOfLines = 0
label.lineBreakMode = NSLineBreakMode.ByWordWrapping
label.font = font
label.text = text
label.sizeToFit()
return label.frame.height
}
EDYTOWAĆ:
Problemu nie było w tym fragmencie kodu, więc moja poprawka tkwi w samym pytaniu. To może być nadal przydatne dla innych!
sizeWithFont
może nie być dostępny dla Swift,String
ale jest dostępny na stronie.NSString
Nadal powinieneś być w stanie to wywołać.Odpowiedzi:
Właśnie umieściłem to na placu zabaw i dla mnie działa.
Zaktualizowano dla Swift 4.0
Swift 3:
źródło
UILabel
według rozmiaru; jeśli ta metoda jest używana wewnątrz,layoutSubviews
z tendencją do wielokrotnego wywoływania dla całego układu, tworzenie dodatkowego obiektu może spowodować zauważalne opóźnienia, szczególnie podczas przewijania.Jeśli używasz autoukładu , możesz dostosować
UILabel
wysokość tylko za pomocą interfejsu użytkownika konfiguracji.Dla iOS8 lub nowszego
UILabel
UILabel
od 1 do 0Dla iOS7
UILabel
Equal
doGreater than or Equal
UILabel
od 1 do 0Twój
UILabel
automatycznie zwiększy wysokość w zależności od tekstuźródło
Tworzę to rozszerzenie, jeśli chcesz
źródło
Mam mocne rozwiązanie robocze.
w układzie
w narządzie tekstu:
UPD. oczywiście z tymi ustawieniami UILabel:
źródło
Wystarczy ustawić:
Etykieta automatycznie dostosowuje swoją wysokość na podstawie ilości wprowadzonego tekstu.
źródło
na podstawie odpowiedzi Anoraka zgadzam się również z obawą Zorayra, więc dodałem kilka wierszy, aby usunąć UILabel i zwrócić tylko CGFloat, nie wiem, czy to pomaga, ponieważ oryginalny kod nie dodaje UIabel, ale to nie zgłasza błędu, więc używam poniższego kodu:
źródło
W Swift 4.1 i Xcode 9.4.1
Tylko 3 kroki
Krok 1)
Krok 2)
Krok 3)
źródło
Rozwiązanie zaproponowane przez Anoraka jako właściwość obliczona w rozszerzeniu dla UILabel:
Stosowanie:
źródło
Podążając za odpowiedzią @Anorak, dodałem to rozszerzenie do String i wysłałem wstawkę jako parametr, ponieważ wiele razy będziesz potrzebować dopełnienia do tekstu. W każdym razie, może niektórym okaże się to przydatne.
źródło
Oto jak obliczyć wysokość tekstu w języku Swift. Następnie możesz pobrać wysokość z prostownika i ustawić wysokość ograniczenia etykiety lub TextView itp.
źródło
po prostu wywołaj tę metodę, gdy potrzebujesz dynamicznej wysokości dla etykiety
źródło
Swift 4.0
self.messageLabel = UILabel (ramka: CGRect (x: 70, y: 60, szerokość: UIScreen.main.bounds.width - 80, wysokość: 30)
Ten link opisuje sposób, w jaki storyboard robi to samo
źródło
Swift 4.0
Zamiast obliczać wysokość tekstu / etykiety po prostu zmieniam rozmiar etykiety po wstawieniu (dynamicznego) tekstu.
Zakładając, że myLabel to dany UILabel:
A teraz najlepsza część:
źródło
Swift 4.1 metodę obliczania wysokości etykiet rozszerzenie:
źródło
Swift 5, XCode 11 w sposób scenorysowy. Myślę, że to działa na iOS 9 i nowszych. Chcesz na przykład etykiety „Opis”, aby uzyskać dynamiczną wysokość, wykonaj następujące czynności:
1) Wybierz etykietę opisu -> Idź do Inspektora atrybutów (ikona ołówka), ustaw: Linie: 0 Podział wiersza: Zawijanie słów
2) Wybierz swój UILabel z serii ujęć i przejdź do Inspektora rozmiaru (ikona linijki), 3) Zejdź do „Priorytet odporności na kompresję treści do 1 dla wszystkich innych komponentów UIView (etykiety, przyciski, widok obrazu itp.), Które wchodzą w interakcję z Twoją etykietą.
Na przykład mam UIImageView, etykietę tytułu i etykietę opisu pionowo w moim widoku. Ustawiam Priorytet odporności na kompresję zawartości na UIImageView i etykietę tytułu na 1, a etykietę opisu na 750. Dzięki temu etykieta opisu będzie miała taką wysokość, jaka jest potrzebna.
źródło
Aby szybko nadać etykietę dynamiczną, nie podawaj ograniczenia wysokości, aw scenorysie utwórz etykietę liczbę wierszy 0, która również daje ograniczenie dolne i jest to najlepszy sposób, w jaki radzę sobie z dynamiczną etykietą zgodnie z rozmiarem zawartości.
źródło
Możesz także użyć
sizeThatFits
funkcji.Na przykład:
label.sizeThatFits(superView.frame.size).height
źródło