Tworzę aplikację, w której będzie wyświetlane pytanie UILabel
i odpowiedzi wielokrotnego wyboru, w UITableView
każdym wierszu będzie wyświetlana opcja wielokrotnego wyboru. Pytania i odpowiedzi będą się różnić, więc potrzebuję UITableView
dynamicznej wysokości.
Chciałbym znaleźć rozwiązanie sizeToFit
dla stołu. Gdzie rama tabeli jest ustawiona na wysokość całej jej zawartości.
Czy ktoś może doradzić, jak mogę to osiągnąć?
- sizeToFit
metodę UIView ?Odpowiedzi:
Właściwie sam znalazłem odpowiedź.
Ja po prostu stworzyć nową
CGRect
dlatableView.frame
zheight
ztable.contentSize.height
To ustawia wysokość
UITableView
doheight
jego zawartości. Ponieważ kod modyfikuje interfejs użytkownika, nie zapomnij uruchomić go w głównym wątku:źródło
Rozwiązanie Swift 5 i 4.2 bez KVO, DispatchQueue lub samodzielnego ustawiania ograniczeń.
To rozwiązanie jest oparte na odpowiedzi Gulza .
1) Utwórz podklasę
UITableView
:2) Dodaj a
UITableView
do swojego układu i ustaw ograniczenia ze wszystkich stron. Ustaw jego klasę naContentSizedTableView
.3) Powinieneś zobaczyć błędy, ponieważ Storyboard nie bierze
intrinsicContentSize
pod uwagę naszej podklasy . Napraw ten problem, otwierając inspektora rozmiaru i zastępując intrinsicContentSize wartością zastępczą. To jest nadpisanie czasu projektowania. W czasie wykonywania użyje on override w naszejContentSizedTableView
klasieAktualizacja: zmieniony kod dla Swift 4.2. Jeśli używasz wcześniejszej wersji, użyj
UIViewNoIntrinsicMetric
zamiastUIView.noIntrinsicMetric
źródło
tableView
aby znaleźć sięIntrinsicTableView
w storyboardzie. Nie musiałem osadzać widoku tabeli w innymUIView
.tableView
sięIntrinsicTableView
. Nie jest też konieczne dodatkowe opakowanieUIView
. Możesz oczywiście użyć dowolnego istniejącego widoku rodzica :)tableView.sizeToFit()
sizeToFit()
należy wywołaćSzybkie rozwiązanie
Wykonaj następujące kroki:
1- Ustaw ograniczenie wysokości stołu z serii ujęć.
2- Przeciągnij ograniczenie wysokości z serii ujęć i utwórz dla niego @IBOutlet w pliku kontrolera widoku.
3- Następnie możesz dynamicznie zmienić wysokość tabeli za pomocą tego kodu:
Aktualizacja
Jeśli ostatni wiersz jest dla Ciebie wycięty, spróbuj wywołać metodę viewWillLayoutSubviews () w funkcji komórki willDisplay:
źródło
Wypróbowałem to w iOS 7 i zadziałało
źródło
Dodaj obserwatora dla właściwości contentSize w widoku tabeli i odpowiednio dostosuj rozmiar ramki
następnie w oddzwonieniu:
Mam nadzieję, że to ci pomoże.
źródło
Miałem widok tabeli w widoku przewijania i musiałem obliczyć wysokość tableView i odpowiednio zmienić jego rozmiar. Oto kroki, które podjąłem:
0) dodaj UIView do swojego scrollView (prawdopodobnie będzie działać bez tego kroku, ale zrobiłem to, aby uniknąć ewentualnych konfliktów) - będzie to widok kontenera dla twojego widoku tabeli. Jeśli zrobisz ten krok, ustaw granice widoków bezpośrednio na widoki tabeli.
1) utwórz podklasę UITableView:
2) ustaw klasę widoku tabeli w Storyboard na IntrinsicTableView: zrzut ekranu: http://joxi.ru/a2XEENpsyBWq0A
3) Ustaw heightConstraint na swój widok tabeli
4) przeciągnij IBoutlet swojej tabeli do kontrolera ViewController
5) przeciągnij IBoutlet ograniczenia wysokości tabeli do swojego ViewController
6) Dodaj tę metodę do swojego ViewController:
Mam nadzieję że to pomoże
źródło
Jeśli nie chcesz samodzielnie śledzić zmian rozmiaru zawartości widoku tabeli, ta podklasa może być przydatna.
źródło
override public var intrinsicContentSize: CGSize { //... return someCGSize }
Jeśli twój contentSize jest nieprawidłowy, dzieje się tak, ponieważ jest oparty na szacowanej wysokościRowHeight (automatycznie), użyj tego przed
źródło: https://forums.developer.apple.com/thread/81895
źródło
Swift 3, iOS 10.3
Rozwiązanie 1: Wystarczy umieścić
self.tableview.sizeToFit()
wcellForRowAt indexPath
funkcji. Upewnij się, że wysokość widoku stołu jest wyższa niż potrzebujesz. To dobre rozwiązanie, jeśli nie masz widoków poniżej widoku tabeli. Jeśli jednak masz, ograniczenie dolnej tabeli widoku nie zostanie zaktualizowane (nie próbowałem tego naprawić, ponieważ wymyśliłem rozwiązanie 2)Przykład:
Rozwiązanie 2: Ustaw ograniczenie wysokości widoku tabeli w scenorysie i przeciągnij go do ViewController. Jeśli znasz średnią wysokość komórki i wiesz, ile elementów zawiera twoja tablica, możesz zrobić coś takiego:
*EDYTOWAĆ:
Po wszystkich rozwiązaniach, które wypróbowałem i każdy z nich coś naprawiał, ale nie do końca, to jest odpowiedź, która całkowicie wyjaśnia i rozwiązuje ten problem.
źródło
Odpowiedź przejazd Mimo użytkownika i odpowiedź Anooj VM „s oba są niesamowite, ale jest mały problem, jeśli masz dużą listę, to możliwe, że wysokość ramy będzie odcięcia niektórych swoich komórek.
Więc. Trochę zmodyfikowałem odpowiedź:
źródło
Jest o wiele lepszy sposób, aby to zrobić, jeśli używasz AutoLayout: zmień ograniczenie określające wysokość. Po prostu oblicz wysokość zawartości tabeli, a następnie znajdź ograniczenie i zmień je. Oto przykład (zakładając, że ograniczenie określające wysokość stołu jest w rzeczywistości ograniczeniem wysokości z relacją „Równe”):
źródło
myTableHeightConstraint.constant = tableView.contentSize.height
Działa to dla mnie przy użyciu automatycznego układu, z widokiem tabeli z tylko jedną sekcją.
Nazywam tę funkcję podczas konfigurowania automatycznego układu (przykład tutaj używa SnapKit, ale masz pomysł):
Chcę, aby UITableView był tak wysoki, jak łączna wysokość komórek; Przechodzę przez komórki w pętli i zliczam całkowitą wysokość komórek. Ponieważ rozmiar widoku tabeli to CGRect.zero w tym momencie, muszę ustawić granice, aby móc przestrzegać reguł automatycznego układu zdefiniowanych przez komórkę. Ustawiłem rozmiar na dowolną wartość, która powinna być wystarczająco duża. Rzeczywisty rozmiar zostanie obliczony później przez system Auto Layout.
źródło
Zrobiłem w nieco inny sposób, Właściwie mój TableView był w widoku przewijania, więc musiałem podać ograniczenie wysokości jako 0.
Następnie w czasie wykonywania wprowadziłem następujące zmiany,
źródło
Jako rozszerzenie odpowiedzi Anooj VM sugeruję, aby odświeżyć rozmiar zawartości tylko wtedy, gdy się zmieni.
Takie podejście również wyłącza prawidłowe przewijanie i obsługuje większe listy i rotację . Nie ma potrzeby dispatch_async, ponieważ zmiany contentSize są wysyłane w głównym wątku.
źródło
objc wersja Musa almatri
źródło
Możesz wypróbować ten niestandardowy
AGTableView
Aby ustawić ograniczenie wysokości TableView przy użyciu scenorysu lub programowo. (Ta klasa automatycznie pobiera ograniczenie wysokości i ustawia wysokość widoku zawartości na wysokość widoku tabeli).
Uwaga Jeśli masz problem z ustawieniem wysokości, to
yourTableView.layoutSubviews()
.źródło
Na podstawie odpowiedzi fl034 . Ale dla użytkowników Xamarin.iOS :
źródło
Moja implementacja Swift 5 polega na ustawieniu ograniczenia wysokości elementu tableView na rozmiar jego content (
contentSize.height
). Ta metoda zakłada, że używasz układu automatycznego. Ten kod należy umieścić wewnątrzcellForRowAt
metody tableView.źródło
Jeśli chcesz, aby tabela była dynamiczna, musisz użyć rozwiązania opartego na zawartości tabeli, jak opisano powyżej. Jeśli chcesz po prostu wyświetlić mniejszą tabelę, możesz użyć widoku kontenera i osadzić w nim UITableViewController - rozmiar UITableView zostanie zmieniony zgodnie z rozmiarem kontenera.
Pozwala to uniknąć wielu obliczeń i wywołań układu.
źródło
above
ponieważ odpowiedzi można wymieszać.Rozwiązanie mu w szybkim 3 : Wywołaj tę metodę
viewDidAppear
źródło