Mam ten dziwny problem, a ja do czynienia z nim przez ponad 8 godzin teraz .. W zależności od sytuacji, mam do obliczenia UILabels
wielkości dynamicznie,
np
mój UIViewController
odbiera zdarzenie i zmienić UILabels
rozmiar. od większego do mniejszego. Rozmiar mojego UILabel
zmniejsza się i otrzymuję odpowiedni wymagany rozmiar, ale tekst w moim UILabel
pozostaje taki sam, ten sam rozmiar czcionki itp. Potrzebuję zmniejszenia czcionki, aby cały tekst pasował do formatu UILabel
. Pytanie brzmi, jak dopasować tekst do mojej etykiety, autoshrinking
czy coś w tym rodzaju?
W moim xib
, UILabels
autoshrink
jest zaznaczone, również liczba linii jest ustawiona na 0, a także mój ciąg ma nowe symbole linii (\ n), a ja wybrałem tryb podziału linii na wordwrap
. Może ktoś był w takiej samej sytuacji jak ja teraz i mógłby mi pomóc? Byłbym naprawdę wdzięczny.
Z góry dziękuję!
EDYCJA: UILabel
minimalny rozmiar czcionki jest ustawiony na 10
źródło
Odpowiedzi:
Jeśli nadal szukasz lepszego rozwiązania, myślę, że tego właśnie chcesz:
Wartość logiczna wskazująca, czy należy zmniejszyć rozmiar czcionki, aby dopasować ciąg tytułu do prostokąta ograniczającego etykietę (ta właściwość jest skuteczna tylko wtedy, gdy
numberOfLines
właściwość jest ustawiona na 1).Ustawiając tę właściwość,
minimumScaleFactor
MUSI być również ustawiona (dobra wartość domyślna to 0,5).Szybki
Cel C
Wartość logiczna wskazująca, czy odstępy między literami powinny być dostosowywane, aby dopasować ciąg w prostokącie granic etykiety.
Szybki
Cel C
Źródło .
źródło
minimumFontSize
jest przestarzały w iOS 6.0. UżyjminimumScaleFactor
zamiast tego.W ten sposób otrzymuję
Autoshrink
pracę UILabel (szczególnie dla wysokości dopasowania czcionki etykiet na urządzeniu 4s z 6s Plus Storyboard) w iOS 9.2, Xcode 7.2 ...źródło
minimumFontSize
jest przestarzałe w iOS 6.Więc użyj
minimumScaleFactor
zamiastminmimumFontSize
.Szybki 5
źródło
moim rozwiązaniem jest również boolowska label.adjustsFontSizeToFitWidth = YES; ALE. W interfejsie Builder należy ustawić opcję Zawijanie słów na „ CLIP ”. Następnie automatycznie zmniejsz etykiety. To jest bardzo ważne.
źródło
W Swift 3 (programowo) musiałem zrobić to:
źródło
Możesz pisać jak
Możesz obliczyć liczbę linii w ten sposób
Mam nadzieję, że to ci pomoże :-) czekam na twoją odpowiedź
źródło
Ostatecznie nie znalazłem odpowiedzi. Myślę, że automatyczne zmniejszanie nie działa dla wielu linii. Skończyło się na tym, że skorzystałem z sugestii w tym linku: autoshrink na UILabel z wieloma liniami
Rozwiązaniem jest obliczenie wysokości tekstu przy określonej szerokości, a jeśli tekst jest większy, zmniejszenie rozmiaru czcionki, a następnie powtórzenie tej czynności, aż wysokość będzie równa lub mniejsza niż wymagany rozmiar.
Nie rozumiem, dlaczego powinno to być takie trudne do wdrożenia. Jeśli czegoś mi brakuje, wszyscy mogą mnie poprawić :)
źródło
To jest dla Swift 3 z Xcode 8.2.1 (8C1002)
Najlepszym rozwiązaniem, które znalazłem, jest ustawienie stałej szerokości w Storyboard lub IB na etykiecie. Ustaw swoje ograniczenia z ograniczeniami do marginesów. W swoim viewDidLoad dodaj następujące wiersze kodu:
Działało to jak urok i nie przelewa się do nowej linii i zmniejsza tekst, aby dopasować go do szerokości etykiety bez żadnych dziwnych problemów i działa w Swift 3.
źródło
To świetne pytanie, ponieważ wydaje się, że byłoby to już częścią wbudowanej
UIKit
funkcjonalności lub powiązanej struktury. Oto dobry wizualny przykład pytania:Nie ma łatwego sposobu na obejście tego problemu, ale na pewno jest to możliwe. Jednym ze sposobów, aby to zrobić, jest programowe wypróbowanie różnych rozmiarów czcionek, aż znajdziesz taki, który pasuje do granic widoku. Możesz to osiągnąć za pomocą
boundingRect()
funkcjiNSString
lubNSAttributedString
. Na przykład:Możesz przeprowadzić wyszukiwanie binarne, aby być bardziej wydajnym niż podejście typu brute force. Istnieją również pewne kwestie, które są nieco bardziej zaangażowane, w tym prawidłowe zawijanie słów i wydajność buforowania czcionek iOS, jeśli szukasz czegoś naprawdę solidnego.
Jeśli zależy Ci tylko na łatwym wyświetlaniu tekstu na ekranie, opracowałem solidną implementację w Swift, której używam również w aplikacji produkcyjnej. Jest to
UIView
podklasa z wydajnym, automatycznym skalowaniem czcionki dla dowolnego tekstu wejściowego, w tym wielu wierszy. Aby go użyć, po prostu zrób coś takiego:Otóż to! Pełne źródło można znaleźć tutaj: https://github.com/FlickType/AccessibilityKit
Mam nadzieję że to pomoże!
źródło
W iOS 9 musiałem tylko:
Ktoś zalecił ustawienie liczby linii na 0, ale dla mnie to właśnie sprawiło, że etykieta przechodziła do wielu linii ...
źródło
UILabel
iUITextField
aw komórce statycznej i kliknąłem „Rozwiąż problemy z autoukładem” i „Dodaj brakujące ograniczenia”. Wszystko się zgadzało, ale funkcja Autoshrink musiała znać odległość do etykiety, dla której opcja „Dodaj brakujące wiązania” nie dodała ograniczenia.Myślę, że możesz napisać poniższy kod po przydzieleniu etykiety init
Dobrze ze mną współpracuje Użyj go
źródło
Dwa lata później ten problem wciąż istnieje ...
W iOS 8 / XCode 6.1 czasami stwierdzałem, że mój
UILabel
(utworzony w aUITableViewCell
, z włączoną funkcją AutoLayout i elastycznymi ograniczeniami, dzięki czemu miał dużo miejsca) nie zmieniłby swojego rozmiaru, aby pasował do ciągu tekstowego.Rozwiązaniem, podobnie jak w poprzednich latach, było ustawienie tekstu, a następnie zadzwonienie
sizeToFit
.(Westchnienie.)
źródło
Oto jak to zrobić Załóżmy, że następujący komunikat Etykieta to etykieta, która ma uzyskać pożądany efekt.Teraz wypróbuj te proste linie kodów:
źródło
nie działa, jeśli
numberOfLines > 1
zrobiłem taki warunek-źródło
Spóźniłem się na imprezę, ale ponieważ miałem dodatkowy wymóg posiadania jednego słowa w wierszu, ten jeden dodatek załatwił sprawę:
label.numberOfLines = [labelString componentsSeparatedByString:@" "].count;
Apple Docs mówi:
Ale to kłamstwo. Kłamstwo, które ci mówię! Dotyczy to wszystkich wersji iOS. W szczególności jest to prawdą, gdy używasz a
UILabel
wewnątrz a,UICollectionViewCell
dla którego rozmiar jest określany przez ograniczenia dostosowywane dynamicznie w czasie wykonywania za pomocą układu niestandardowego (np.self.menuCollectionViewLayout.itemSize = size
).Zatem w połączeniu z
adjustsFontSizeToFitWidth
iminimumScaleFactor
, jak wspomniano w poprzednich odpowiedziach, programowe ustawienienumberOfLines
oparte na liczbie słów rozwiązało problem automatycznego skurczu. Wykonanie czegoś podobnego na podstawie liczby słów lub nawet liczby znaków może dać „wystarczająco bliskie” rozwiązanie.źródło
W Swift 4 (programowo):
źródło
Swift 4, Xcode 9.4.1
Rozwiązanie, które dla mnie zadziałało: miałem etykietę w komórce widoku kolekcji i tekst etykiety był przycinany. Ustaw atrybuty jak poniżej w Storyboard
źródło