Z miłości do Boga nie mogę zawisnąć w tym superwizji zmiany rozmiaru.
Mam UIView *superview
z 4 UILabels
. 2 pełnią funkcję nagłówka dla dwóch pozostałych.
Zawartość wszystkich 4 jest dynamiczna i pochodzi z bazy danych.
SizeToFit
vs SizeThatFits:(CGSize)
vs UIView systemLayoutSizeFittingSize:
, podając albo UILayoutFittingCompressedSize
lub UILayoutFittingExpandedSize
.
Używam autoukładu programowo i ustawiłem wysokość nadzoru na równą lub większą liczbę fikcyjną.
gdzie i jak używać tych SizeToFit
vs sizeThatFits:(CGSize)
vs UIView systemLayoutSizeFittingSize:
, podając albo UILayoutFittingCompressedSize
lub UILayoutFittingExpandedSize
. Przeczytałem wiele wskazówek dotyczących stosu, ale skończyło się na niczym.
CZY muszę ponownie obliczyć ograniczenia dla superwizji w konkretnym miejscu. Czy może ustawić wysokość na „@ property” w swojej klasie kontrolera, a następnie usunąć i ponownie go odczytać? Próbowałem umieścić wszystko wszędzie, a potem trochę. Nadal otrzymuję wynik końcowy tego samego rozmiaru z fikcyjną wysokością i tekstem unoszącym się na zewnątrz. Nawet po ustawieniu clipsToBound w podglądzie.
Drapię się po włosach… pomocy
źródło
Odpowiedzi:
Jeśli używasz układu automatycznego, oto, co musisz zrobić:
Upewnij się, że nie dodajesz stałych ograniczeń szerokości i / lub wysokości do żadnego z widoków podrzędnych (w zależności od wymiarów, które chcesz dynamicznie zmieniać). Chodzi o to, aby wewnętrzny rozmiar treści każdego widoku podrzędnego określał jego wysokość.
UILabel
s są dostarczane z 4 automatycznymi niejawnymi ograniczeniami, które (z priorytetem mniejszym niż Wymagany) będą próbowały utrzymać ramkę etykiety na dokładnym rozmiarze wymaganym do zmieszczenia całego tekstu w środku.Upewnij się, że krawędzie każdej etykiety są sztywno połączone (z Wymaganymi ograniczeniami pierwszeństwa) ze sobą nawzajem i z ich nadzorem. Chcesz się upewnić, że jeśli wyobrazisz sobie, że jedna z etykiet się powiększy, zmusi to inne etykiety do zrobienia dla niej miejsca i, co najważniejsze, do rozszerzenia funkcji superview.
Dodawaj ograniczenia tylko do nadzoru, aby ustawić jego pozycję, a nie rozmiar (przynajmniej nie dla wymiarów, które chcesz dynamicznie zmieniać). Pamiętaj, że jeśli poprawnie ustawisz wewnętrzne wiązania, ich rozmiar zostanie określony przez rozmiary wszystkich podglądów podrzędnych, ponieważ jego krawędzie są w jakiś sposób połączone z ich krawędziami.
Otóż to. Nie musisz dzwonić
sizeToFit
anisystemLayoutSizeFittingSize:
uruchamiać tego, po prostu załaduj swoje poglądy i ustaw tekst i to powinno być na tyle. Silnik układu systemu wykona obliczenia, aby rozwiązać Twoje ograniczenia. (Jeśli już, być może będziesz musiał zadzwonićsetNeedsLayout
do nadzoru ... ale to nie powinno być wymagane).źródło
constraintsWithVisualFormat
i całkowicie rozumiem twój punkt widzenia na temat rozciągania się podglądów podrzędnych i wypychania ich do rozmiaru :)translatesAutoresizingMaskIntoConstraints = NO
jeśli używasz xib.Użyj widoków kontenera
W poniższym przykładzie mam obraz 30x30 i
UILabel
jest mniejszy niż widok zawierający tekst zastępczy. Potrzebowałem widoku zawierającego, który był co najmniej tak duży jak obraz, ale musiał urosnąć, aby zawierał tekst wielowierszowy.W formacie wizualnym kontener wewnętrzny wygląda następująco:
H:|-(15.0)-[image(30.0)]-(15.0)-[label]-(15.0)-| V:|[image(30.0)]| V:|[label(>=30.0)]|
Następnie ustaw widok zawierający pasujący do wysokości etykiety. Teraz widok zawierający dostosuje rozmiar etykiety.
Jak zauważył @smileyborg w swojej odpowiedzi, sztywne połączenie treści z superviewem informuje silnik układu, że prosty widok kontenera powinien spowodować jego wzrost.
Żółte prostokąty wyrównania
Jeśli chcesz, aby żółte prostokąty wyrównania zostały dodane
-UIViewShowAlignmentRects YES
do listy argumentów uruchamiania twojego schematu.źródło
-UIViewShowAlignmentRects YES
- świetna wskazówka!Zostało to znacznie łatwiejsze dzięki wprowadzeniu widoków stosu w systemie iOS 9. Użyj widoku stosu w widoku, aby zawrzeć całą zawartość, która zmienia rozmiar, a następnie po prostu wywołaj
po zmianie treści. Następnie możesz uzyskać nowy rozmiar, dzwoniąc
view.systemLayoutSizeFittingSize(UILayoutFittingCompressedSize)
jeśli kiedykolwiek będziesz musiał obliczyć dokładny rozmiar wymagany dla widoku.
źródło
Jest to prawie zgodne z odpowiedzią @smileyborg i zawiera konkretny przykład.
Nie będzie opisywać wszystkich ograniczeń, ale te związane z obliczaniem wysokości obiektów UI.
height
ograniczenia, w tym przypadku AutoLayout nie zmieni rozmiaru etykiet w celu dopasowania do tekstu, więc kluczem jest ustawienie ograniczeń krawędzi. (zielone strzałki)[Podgląd] Kroki 1 i 3 są bardzo łatwe do wykonania, ale ten krok może zostać źle zrozumiany. Podobnie jak w przypadku etykiet, podglądy podrzędne nie mogą mieć
height
ustawionych ograniczeń. Wszystkie widoki podrzędne muszą miećtop
ustawione ograniczenie, ignorującbottom
ograniczenie, co może sprawić, że myślisz, że wyzwoli niezadowalający wyjątek ograniczenia w czasie wykonywania, ale nie będzie, jeśli ustawiszbottom
ograniczenie dla ostatniego widoku podrzędnego. Pominięcie tego spowoduje zniszczenie układu. (Czerwone strzały)[Superview] Ustaw wszystkie ograniczenia tak, jak potrzebujesz, ale zwróć dużą uwagę na
height
ograniczenie. Przypisz mu losową wartość, ale ustaw ją jako opcjonalną, AutoLayout ustawi wysokość dokładnie tak, aby pasowała do podwidoków. (niebieskie strzałki)Działa to doskonale, nie ma potrzeby wywoływania żadnych dodatkowych metod aktualizacji układu systemu.
źródło