Podczas umieszczania etykiety wielowierszowej (z podziałem wiersza ustawionym na Zawijanie wierszy) w widoku stosu, etykieta natychmiast traci podział wiersza i zamiast tego wyświetla tekst etykiety w jednym wierszu.
Dlaczego tak się dzieje i jak można zachować etykietę wielowierszową w widoku stosu?
Odpowiedzi:
Prawidłowa odpowiedź jest tutaj:
https://stackoverflow.com/a/43110590/566360
UILabel
wnętrzeUIView
(Edytor -> Osadź w -> Widok)UILabel
doUIView
(na przykład spacja końcowa, spacja górna i spacja wiodąca do ograniczeń superwiewu)UIStackView
Będzie wyciagnacUIView
aby prawidłowo dopasować iUIView
ograniczyUILabel
do wielu linii.źródło
UIView
oszustwa nie są konieczne.W przypadku poziomego widoku stosu, który ma
UILabel
jako jeden z widoków, należy najpierw ustawić w programie Interface Builderlabel.numberOfLines = 0
. Powinno to pozwolić, aby etykieta miała więcej niż 1 linię. Początkowo nie działało to dla mnie, gdy działał widok stosustackView.alignment = .fill
. Aby to działało, wystarczy ustawićstackView.alignment = .center
. Etykieta może teraz rozszerzać się do wielu wierszy w plikuUIStackView
.Dokumentacja Apple mówi
Zwróć uwagę na słowo z wyjątkiem tutaj. Gdy
.fill
jest używany,UIStackView
rozmiar poziomy NIE zmienia się w pionie przy użyciu rozmieszczonych rozmiarów widoków podrzędnych.źródło
.alignment
UIStackView, który musisz ustawić na cokolwiek, ale.fill
nie UILabel, co w podanym przykładzie jest trochę zagmatwanelabel.alignment = .center
. Myślę, że to powinno byćstackView.alignment = .center
multiLine
chyba że nadasz mu stałą szerokość. Kiedy ustalamy jego szerokość, łamie się do multilinii, gdy ta szerokość zostanie osiągnięta, jak pokazano:Jeśli nie damy stałej szerokości w widoku stosu, sprawy staną się niejednoznaczne. Jak długo widok stosu będzie się powiększał wraz z etykietą (jeśli wartość etykiety jest dynamiczna)?
Mam nadzieję, że to rozwiąże problem.
źródło
preferredMaxLayoutWidth
wviewDidLayoutSubviews
dla swojej etykiety wUIViewController
lub wlayoutSubviews
podklasieUIView
.Ustawienie preferowanegoMaxLayoutWidth na UILabel zadziałało
źródło
.center
i naprawdę nie potrzebowałem mojej etykiety w UIView.Po prostu ustaw liczbę wierszy na 0 w Inspektorze atrybutów dla etykiety. To zadziała dla Ciebie.
źródło
Po wypróbowaniu wszystkich powyższych sugestii stwierdziłem, że UIStackView nie wymaga zmiany właściwości. Po prostu zmieniam właściwości etykiet UIL w następujący sposób (etykiety są już dodane do widoku stosu pionowego):
Przykład języka Swift 4:
źródło
Magiczna sztuczka polegała na ustawieniu a
widthAnchor
naUIStackView
.Ustawienie
leadingAnchor
itrailingAnchor
nie zadziała, ale ustawieniecenterXAnchor
iwidthAnchor
sprawiło, że UILabel wyświetla się poprawnie.źródło
iOS 9+
Zadzwoń
[textLabel sizeToFit]
po ustawieniu tekstu UILabel.sizeToFit zmieni układ etykiety wielowierszowej przy użyciu preferowanegoMaxWidth. Etykieta zmieni rozmiar stackView, co spowoduje zmianę rozmiaru komórki. Nie są wymagane żadne dodatkowe ograniczenia poza przypinaniem widoku stosu do widoku zawartości.
źródło
Oto pełny przykład pionu
UIStackView
złożonego z multiliniiUILabel
z automatyczną wysokością.Etykiety zawijane są na podstawie szerokości widoku stosu, a wysokość widoku stosu jest określana na podstawie zawiniętej wysokości etykiety. (Dzięki temu podejściu nie musisz osadzać etykiet w a
UIView
.) (Swift 5, iOS 12.2)Oto próbka,
ViewController
która go używa.źródło
Dodaj
UIStackView
właściwości,Zamiast dodawać etykietę w środku,
UIView
która nie jest wymagana.Jeśli używasz w środkuUITableViewCell
, przeładuj dane o rotacji.źródło
Poniżej przedstawiono implementację etykiety wieloliniowej Playground z podziałem wiersza wewnątrz
UIStackView
. Nie wymaga osadzaniaUILabel
niczego w środku i został przetestowany z Xcode 9.2 i Swift 4. Mam nadzieję, że jest pomocny.źródło
Układ systemu powinien określać początek, szerokość i wysokość, aby narysować podglądy, w tym przypadku wszystkie Twoje podglądy mają ten sam priorytet, ten punkt powoduje konflikt, system układu nie zna zależności między widokami, który z nich rysuje pierwszy, drugi itd.
Kompresja set stack subviews rozwiąże problem z wieloma liniami, w zależności od tego, czy twój widok stosu jest poziomy czy pionowy i który z nich ma być wieloma liniami.
stackOtherSubviews .setContentCompressionResistancePriority(.defaultHight, for: .horizontal)
lblTitle.setContentCompressionResistancePriority(.defaultLow, for: .horizontal)
źródło
W moim przypadku postępowałem zgodnie z poprzednimi sugestiami, ale mój tekst nadal był skracany do jednej linii, choć tylko w orientacji poziomej. Okazuje się, że znalazłem niewidoczny
\0
znak zerowy w tekście etykiety, który był winowajcą. Musiało być wprowadzone obok symbolu myślnika, który wstawiłem. Aby sprawdzić, czy dzieje się tak również w Twoim przypadku, użyj narzędzia View Debugger, aby wybrać etykietę i sprawdzić jej tekst.źródło
Xcode 9.2:
Po prostu ustaw liczbę linii na 0. Storyboard będzie wyglądał dziwnie po ustawieniu tego. Nie martw się, uruchom projekt. Podczas uruchamiania wszystko zmieni rozmiar zgodnie z konfiguracją scenorysu. Myślę, że to rodzaj błędu w scenorysie.
Wskazówki: Ustaw „liczbę wkładek na 0” w ostatniej. zresetuj go, jeśli chcesz edytować inny widok i ustaw na 0 po edycji.
źródło
Co mi pomogło!
widok stosu: wyrównanie: wypełnienie, dystrybucja: wypełnienie, proporcjonalna szerokość ograniczenia do nadzoru np. 0,8,
label: center i lines = 0
źródło
Dla każdego, kto nadal nie może tego zrobić. Spróbuj ustawić Autoshrink z minimalną skalą czcionki na tym UILabel.
Zrzut ekranu Ustawienia automatycznego skurczu UILabel
źródło
To prawie jak odpowiedź @ Andy'ego, ale możesz dodać swoją
UILabel
dodatkowąUIStackview
, pionową pracę dla mnie.źródło
Dla mnie problem polegał na tym, że wysokość widoku stosu była po prostu za mała. Etykieta i widok stosu zostały prawidłowo skonfigurowane, aby umożliwić etykietę składającą się z wielu wierszy, ale etykieta była pierwszą ofiarą kompresji treści, której użył widok stosu, aby uzyskać wystarczająco małą wysokość.
źródło