Moje rozumienie autoukładu jest takie, że bierze rozmiar superwizji i na podstawie ograniczeń i wewnętrznych rozmiarów oblicza pozycje podwidoków.
Czy istnieje sposób na odwrócenie tego procesu? Chcę zmienić rozmiar superview na podstawie ograniczeń i wewnętrznych rozmiarów. Jaki jest najprostszy sposób osiągnięcia tego?
Mam widok zaprojektowany w Xcode, którego używam jako nagłówka UITableView
. Ten widok zawiera etykietę i przycisk. Rozmiar etykiety różni się w zależności od danych. W zależności od ograniczeń etykieta pomyślnie naciska przycisk w dół lub jeśli istnieje ograniczenie między przyciskiem a dolną częścią nadzoru, etykieta jest kompresowana.
Znalazłem kilka podobnych pytań, ale nie mają one dobrych i łatwych odpowiedzi.
Odpowiedzi:
Prawidłowe API do stosowania jest
UIView systemLayoutSizeFittingSize:
, przekazując alboUILayoutFittingCompressedSize
alboUILayoutFittingExpandedSize
.W przypadku normalnego
UIView
korzystania z autoukładu powinno to działać tak długo, jak długo ograniczenia są poprawne. Jeśli chcesz go użyć naUITableViewCell
(na przykład do określenia wysokości wiersza), powinieneś wywołać go w swojej komórcecontentView
i złapać wysokość.Dalsze rozważania istnieją, jeśli masz jeden lub więcej UILabel, które są wielowierszowe. W tym przypadku konieczne jest prawidłowe ustawienie
preferredMaxLayoutWidth
właściwości, tak aby etykieta zawierała poprawnąintrinsicContentSize
, która zostanie użyta wsystemLayoutSizeFittingSize's
obliczeniach.EDYCJA: na żądanie, dodanie przykładu obliczenia wysokości dla komórki widoku tabeli
Używanie autoukładu do obliczania wysokości komórek tabeli nie jest super wydajne, ale z pewnością jest wygodne, zwłaszcza jeśli masz komórkę o złożonym układzie.
Jak powiedziałem powyżej, jeśli używasz multilinii
UILabel
, konieczne jest zsynchronizowanie zpreferredMaxLayoutWidth
szerokością etykiety.UILabel
Aby to zrobić, używam niestandardowej podklasy:Oto sztuczna podklasa UITableViewController demonstrująca heightForRowAtIndexPath:
Prosta komórka niestandardowa:
A oto obraz ograniczeń zdefiniowanych w Storyboard. Zwróć uwagę, że na etykiecie nie ma ograniczeń wysokości / szerokości - są one wywnioskowane z etykiety
intrinsicContentSize
:źródło
sizingCell
lub jegocontentView
.sizingCell
, że szerokość odpowiadatableView
szerokości.Komentarz Erica Baker'a wskazał mi podstawową ideę, że aby widok był określany przez zawartość umieszczoną w nim, zawartość umieszczona w nim musi mieć wyraźny związek z widokiem zawierającym, aby napędzać jego wysokość (lub szerokość) dynamicznie . „Dodaj widok podrzędny” nie tworzy tej relacji, jak można by przypuszczać. Musisz wybrać, który widok podrzędny będzie sterował wysokością i / lub szerokością kontenera ... najczęściej jest to element interfejsu użytkownika, który umieściłeś w prawym dolnym rogu ogólnego interfejsu użytkownika. Oto kod i komentarze w wierszu, które ilustrują ten punkt.
Uwaga: może to mieć szczególną wartość dla osób pracujących z widokami przewijania, ponieważ często projektuje się wokół pojedynczego widoku zawartości, który określa jego rozmiar (i przekazuje go do widoku przewijania) dynamicznie na podstawie tego, co w nim umieścisz. Powodzenia, mam nadzieję, że to komuś pomoże.
źródło
Możesz to zrobić, tworząc ograniczenie i łącząc je za pomocą konstruktora interfejsu
Zobacz wyjaśnienie: Auto_Layout_Constraints_in_Interface_Builder
raywenderlich początek-automatyczny-układ
Podstawy ograniczeń artykułów AutolayoutPG
połącz to gniazdo Ograniczenia z widokami podrzędnymi Ogranicz lub połącz super widoki Ograniczenie i ustaw je zgodnie z własnymi wymaganiami w ten sposób
Mam nadzieję, że to wyjaśnia to.
źródło
Można to zrobić dla normalnego
subview
wnętrza większegoUIView
, ale nie działa to automatycznieheaderViews
. WysokośćheaderView
jest określona przez co zwracana przeztableView:heightForHeaderInSection:
więc trzeba obliczyćheight
w oparciu oheight
naUILabel
przestrzeni plus dlaUIButton
a wszelkiepadding
potrzebujesz. Musisz zrobić coś takiego:Tutaj
headerString
jest cokolwiek ciąg chcesz, aby wypełnićUILabel
, a liczba 281 jestwidth
zUILabel
(jak w konfiguracjiInterface Builder
)źródło