Obecnie mam UILabel
:
factLabel = [[UILabel alloc] initWithFrame:CGRectMake(20, 100, 280, 100)];
factLabel.text = @"some text some text some text some text";
factLabel.backgroundColor = [UIColor clearColor];
factLabel.lineBreakMode = UILineBreakModeWordWrap;
factLabel.numberOfLines = 10;
[self.view addSubview:factLabel];
Przez całe życie mojej aplikacji na iOS factLabel
dostaje mnóstwo różnych wartości. Niektóre z wieloma zdaniami, inne z zaledwie 5 lub 6 słowami.
Jak mogę ustawić UILabel
tak, aby rozmiar czcionki zmieniał się, aby tekst zawsze mieścił się w zdefiniowanych przeze mnie granicach?
ios
objective-c
fonts
uilabel
CodeGuy
źródło
źródło
Odpowiedzi:
Pojedyncza linia:
Powyższy kod dostosuje rozmiar czcionki tekstu do (na przykład)
8
próby dopasowania tekstu do etykiety.numberOfLines = 1
jest obowiązkowe.Wiele linii:
Dla
numberOfLines > 1
istnieje metoda, aby dowiedzieć się rozmiar tekstu końcowego przez NSString za sizeWithFont ... addycyjnych UIKit metody, na przykład:Następnie możesz po prostu zmienić rozmiar etykiety przy użyciu wynikowego
lLabelSize
, na przykład (zakładając, że zmienisz tylko wysokość etykiety):iOS6
Pojedyncza linia:
Począwszy od iOS6,
minimumFontSize
był przestarzały. Liniamożna zmienić na:
iOS7
Wiele linii:
Począwszy od iOS7,
sizeWithFont
staje się przestarzały. Obudowa multilinii została zredukowana do:iOS 13 (Swift 5):
źródło
sizeWithFont:constrainedToSize:lineBreakMode:
Ale ten sposób jest trochę trudnymyLabel.minimumScaleFactor:10.0/[UIFont labelFontSize];
minimumFontSize
został wycofany z iOS 6. Możesz używaćminimumScaleFactor
.Spowoduje to dostosowanie rozmiaru czcionki do szerokości etykiety i tekstu.
źródło
adjustsFontSizeToFitWidth
zmniejsza tekst tylko wtedy, gdy nie mieści się w kontenerzeW oparciu o odpowiedź @Eyal Ben Dov możesz chcieć utworzyć kategorię, aby uczynić ją elastyczną w innych aplikacjach.
Obs .: Zaktualizowałem jego kod, aby był zgodny z iOS 7
Plik nagłówka
-Implementation file
-Stosowanie
Twoje zdrowie
źródło
setNeedsLayout
/layoutIfNeeded
jeśli korzystasz z AutoLayout).Pojedyncza linia - są dwa sposoby, które możesz po prostu zmienić.
1- Pragmatycznie (Swift 3)
Wystarczy dodać następujący kod
2 - Korzystanie z inspektora atrybutów UILabel
źródło
Jest 2015. Musiałem znaleźć post na blogu, który wyjaśniłby, jak to zrobić w najnowszej wersji iOS i XCode z Swift, aby działał z wieloma liniami.
Źródło: http://beckyhansmeyer.com/2015/04/09/autoshrinking-text-in-a-multiline-uilabel/
źródło
Wersja szybka:
źródło
Oto rozszerzenie Swift dla UILabel. Działa algorytm wyszukiwania binarnego, aby zmienić rozmiar czcionki na podstawie szerokości i wysokości granic etykiety. Testowany do pracy z iOS 9 i autolayout.
SPOSÓB UŻYCIA: Gdzie
<label>
jest twój wstępnie zdefiniowany UILabel, który wymaga zmiany rozmiaru czcionkiDomyślnie ta funkcja wyszukuje w zakresie rozmiarów czcionek 5pt i 300pt i ustawia czcionkę tak, aby „idealnie” mieściła się w tekście (w granicach 1,0pt). Można zdefiniować parametry, aby na przykład wyszukiwało między 1pt a bieżącym rozmiarem czcionki z dokładnością do 0,1 punktu w następujący sposób:
Skopiuj / Wklej następujący kod do swojego pliku
UWAGA: Każde z
layoutIfNeeded()
połączeń można usunąć według własnego uznaniaźródło
To trochę nie jest wyrafinowane, ale to powinno działać, na przykład powiedzmy, że chcesz ograniczyć swój uilabel do 120x120, przy maksymalnym rozmiarze czcionki 28:
źródło
Wystarczy wysłać wiadomość sizeToFit do UITextView. Dostosuje swoją wysokość, tak aby pasowała do tekstu. Nie zmieni własnej szerokości ani pochodzenia.
źródło
sizeToFit
listytextViewA1
staje się 200 punktów, które kończy się coraz przycięte.Wersja Swift 2.0:
źródło
To rozwiązanie działa w przypadku multilinii:
Po przeczytaniu kilku artykułów i wymaganiu funkcji, która automatycznie skalowałaby tekst i dostosowywała liczbę wierszy do najlepiej dopasowanego do podanego rozmiaru etykiety, sam napisałem funkcję. (tzn. krótki sznurek dobrze pasowałby do jednej linii i używałby dużej ilości ramki etykiety, podczas gdy długi silny automatycznie dzieliłby się na 2 lub 3 linie i odpowiednio dostosowywałby rozmiar)
Możesz go ponownie użyć i dostosować w razie potrzeby. Pamiętaj, aby wywołać go po
viewDidLayoutSubviews
zakończeniu, aby ustawić początkową ramkę etykiety.źródło
Oto kod wypełnienia podklasy UILabel, która wprowadza animowaną zmianę rozmiaru czcionki:
źródło