Dynamiczny tekst o zmiennej długości jest wstawiany do etykiet komórek widoku tabeli. Aby wysokości komórek widoku tabeli były dynamicznie zmieniane, zaimplementowałem w viewDidLoad()
:
self.tableView.estimatedRowHeight = 88.0
self.tableView.rowHeight = UITableViewAutomaticDimension
Działa to dobrze w przypadku komórek, które nie zostały jeszcze przewinięte (jak UITableViewAutomaticDimention
jest wywoływane podczas przewijania do komórki), ale nie w przypadku komórek, które są początkowo renderowane na ekranie po załadowaniu tabeli z danymi.
Próbowałem po prostu przeładować dane (jak sugerowano w wielu innych zasobach):
self.tableView.reloadData()
w obu viewDidAppear()
i viewWillAppear()
i bezskutecznie. Zgubiłem się ... czy ktoś wie, jak sprawić, by xcode renderował dynamiczną wysokość komórek ładowanych początkowo na ekranie?
Daj mi znać, jeśli istnieje lepsza metoda alternatywna.
źródło
Odpowiedzi:
Spróbuj tego:
func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { return UITableViewAutomaticDimension }
EDYTOWAĆ
func tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { return UITableViewAutomaticDimension }
Szybki 4
func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat { return UITableViewAutomaticDimension }
Swift 4.2
func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat { return UITableView.automaticDimension }
Zdefiniuj powyżej Obie metody.
Rozwiązuje problem.
PS: Aby to zadziałało, wymagane są ograniczenia na górze i na dole.
Oto przykład
źródło
Użyj tego:
tableView.rowHeight = UITableViewAutomaticDimension tableView.estimatedRowHeight = 300
i nie używaj:
heightForRowAtIndexPath
funkcji delegowaniaPonadto w scenorysie nie ustawiaj wysokości etykiety, która zawiera dużą ilość danych. Daj mu
top, bottom, leading, trailing
ograniczenia.źródło
heightForRowAtIndexPath
SWIFT 3
tableView.rowHeight = UITableViewAutomaticDimension tableView.estimatedRowHeight = 160
I!!! W storyBoard: MUSISZ ustawić górne i dolne ograniczenia dla swojej etykiety. Nic więcej.
źródło
Ten dziwny błąd został rozwiązany za pomocą parametrów Interface Builder, ponieważ inne odpowiedzi nie rozwiązały problemu.
Jedyne, co zrobiłem, to zwiększyć domyślny rozmiar etykiety, niż potencjalnie mogłaby być treść, i odzwierciedlić to również w
estimatedRowHeight
wysokości. Wcześniej ustawiałem domyślną wysokość wiersza w Interface Builder na88px
i odzwierciedlałem to w ten sposób w moim kontrolerzeviewDidLoad()
:self.tableView.rowHeight = UITableViewAutomaticDimension self.tableView.estimatedRowHeight = 88.0
Ale to nie zadziałało. Więc zdałem sobie sprawę, że zawartość nigdy nie stanie się większa niż być może
100px
, więc ustawiłem domyślną wysokość komórki na108px
(większą niż potencjalna zawartość) i odzwierciedlam to w kontrolerzeviewDidLoad()
:self.tableView.rowHeight = UITableViewAutomaticDimension self.tableView.estimatedRowHeight = 108.0
To faktycznie pozwoliło kodowi zmniejszyć początkowe etykiety do odpowiedniego rozmiaru. Innymi słowy, nigdy nie rozszerzył się do większego rozmiaru, ale zawsze mógł się skurczyć ... Poza tym nie
self.tableView.reloadData()
było potrzeby dodatkowegoviewWillAppear()
.Wiem, że nie obejmuje to bardzo zmiennych rozmiarów treści, ale zadziałało to w mojej sytuacji, w której treść miała maksymalną możliwą liczbę znaków.
Nie jestem pewien, czy jest to błąd w Swift lub Interface Builder, ale działa jak urok. Spróbuj!
źródło
Ustaw automatyczny wymiar wysokości i szacowanej wysokości wiersza i wykonaj następujące czynności:
@IBOutlet weak var table: UITableView! override func viewDidLoad() { super.viewDidLoad() // Set automatic dimensions for row height // Swift 4.2 onwards table.rowHeight = UITableView.automaticDimension table.estimatedRowHeight = UITableView.automaticDimension // Swift 4.1 and below table.rowHeight = UITableViewAutomaticDimension table.estimatedRowHeight = UITableViewAutomaticDimension } // UITableViewAutomaticDimension calculates height of label contents/text func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { // Swift 4.2 onwards return UITableView.automaticDimension // Swift 4.1 and below return UITableViewAutomaticDimension }
Na przykład: jeśli masz etykietę w swoim UITableviewCell,
Oto przykładowa etykieta z dynamicznymi ograniczeniami wysokości.
źródło
Dynamiczna komórka rozmiaru UITableView wymagała 2 rzeczy
Wywołanie tych właściwości TableView w viewDidLoad ()
tableView.rowHeight = UITableViewAutomaticDimension tableView.estimatedRowHeight = 140
To jest cudowny samouczek dotyczący samorozmiaru (komórki dynamicznego widoku tabeli) napisany w języku Swift 3.
źródło
W przypadku Swift 3 możesz użyć:
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { return UITableViewAutomaticDimension } func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat { return UITableViewAutomaticDimension }
źródło
Dla Swift 4.2
@IBOutlet weak var tableVw: UITableView! override func viewDidLoad() { super.viewDidLoad() // Set self as tableView delegate tableVw.delegate = self tableVw.rowHeight = UITableView.automaticDimension tableVw.estimatedRowHeight = UITableView.automaticDimension } // UITableViewDelegate Method func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { return UITableView.automaticDimension }
Miłego kodowania :)
źródło
Próbować
override func viewWillAppear(animated: Bool) { self.tableView.layoutSubviews() }
Miałem ten sam problem i u mnie to działa.
źródło
Aby autoregulacja UITableViewCell działała, upewnij się, że wprowadzasz te zmiany:
W funkcji viewDidLoad Twojego UIViewControllera ustawionej poniżej właściwości UITableView:
self.tableView.estimatedRowHeight = <minimum cell height> self.tableView.rowHeight = UITableViewAutomaticDimension
źródło
<minimum cell height>
forestimatedRowHeight
) naprawdę rozwiązało mój problem. Wcześniej komórka dokonywała autorezyzacji, ale otrzymywałem też różne ostrzeżenia o ograniczeniach. Teraz nie! Więc bardzo dziękuję, Anshul !!Dla Swift sprawdziłem tę odpowiedź również w iOS 9.0 i iOS 11 (Xcode 9.3)
func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { return UITableViewAutomaticDimension } func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat { return UITableViewAutomaticDimension }
Tutaj musisz dodać górne, dolne, prawe i lewe ograniczenia
źródło
W moim przypadku - w scenorysie miałem dwie etykiety, jak na poniższym obrazku, obie etykiety miały ustawione pożądane wartości szerokości, zanim je wyrównałem. po odznaczeniu zmieni się na automatyczny i jak zwykle posiadanie poniższych rzeczy powinno działać jak urok.
1.rowHeight = UITableView.automaticDimension, and 2.estimatedRowHeight = 100(In my case). 3.make sure label number of lines is zero.
źródło
Oprócz tego, co powiedzieli inni,
USTAW OGRANICZENIA DOTYCZĄCE ETYKIETY W ODNIESIENIU DO WERYFIKACJI!
Dlatego zamiast umieszczać ograniczenia etykiety względem innych elementów wokół niej, ogranicz ją do widoku zawartości komórki widoku tabeli.
Następnie upewnij się, że wysokość etykiety jest większa lub równa 0, a liczba wierszy jest ustawiona na 0.
Następnie
ViewDidLoad
dodaj:tableView.estimatedRowHeight = 695 tableView.rowHeight = UITableViewAutomaticDimension
źródło
Jest to proste, gdy robisz 2 rzeczy:
tableView.rowHeight = UITableView.automaticDimension
Dzięki temu silnik układu może obliczyć wysokość komórki i poprawnie zastosować wartość.
źródło
Zainspirowało mnie Twoje rozwiązanie i spróbowałem innego sposobu.
Spróbuj dodać
tableView.reloadData()
doviewDidAppear()
.To działa dla mnie.
Myślę, że przewijanie to „to samo”, co reloadData. Kiedy przewijasz ekran, to tak, jakbyś dzwonił,
reloadData()
kiedyviewDidAppear
.Jeśli to zadziała, proszę odpowiedzieć na tę odpowiedź, abym mógł być pewien tego rozwiązania.
źródło
Niestety nie jestem pewien, czego mi brakowało. Powyższe metody nie działają dla mnie, aby uzyskać wysokość komórki xib lub pozwolić layoutifneeded () lub UITableView.automaticDimension na wykonanie obliczenia wysokości. Szukałem i próbowałem przez 3 do 4 nocy, ale nie mogłem znaleźć odpowiedzi. Niektóre odpowiedzi tutaj lub w innym poście dały mi jednak wskazówki dotyczące obejścia tego problemu. To głupia metoda, ale działa. Po prostu dodaj wszystkie swoje komórki do tablicy. A następnie ustaw wylot każdego ograniczenia wysokości w scenorysie xib. Na koniec dodaj je w metodzie heightForRowAt. Jeśli nie znasz tych interfejsów API, jest to proste.
Swift 4.2
CustomCell.Swift
@IBOutlet weak var textViewOneHeight: NSLayoutConstraint! @IBOutlet weak var textViewTwoHeight: NSLayoutConstraint! @IBOutlet weak var textViewThreeHeight: NSLayoutConstraint! @IBOutlet weak var textViewFourHeight: NSLayoutConstraint! @IBOutlet weak var textViewFiveHeight: NSLayoutConstraint!
MyTableViewVC.Swift
. . var myCustomCells:[CustomCell] = [] . . override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = Bundle.main.loadNibNamed("CustomCell", owner: self, options: nil)?.first as! CustomCell . . myCustomCells.append(cell) return cell } override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { let totalHeight = myCustomCells[indexPath.row].textViewOneHeight.constant + myCustomCells[indexPath.row].textViewTwoHeight.constant + myCustomCells[indexPath.row].textViewThreeHeight.constant + myCustomCells[indexPath.row].textViewFourHeight.constant + myCustomCells[indexPath.row].textViewFiveHeight.constant return totalHeight + 40 //some magic number }
źródło
Używam tych
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { return 100 }
źródło
Powinieneś po prostu ustawić wszystkie ograniczenia GÓRA , DÓŁ i WYSOKOŚĆ dla każdego obiektu w widoku / widokach komórek i usunąć istniejącą środkową pozycję Y, jeśli tak. Ponieważ tam, gdzie tego nie zrobiłeś, umieszcza artefakty na innych widokach.
źródło
Dla celu c jest to jedno z moich fajnych rozwiązań. to działa dla mnie.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { cell.textLabel.text = [_nameArray objectAtIndex:indexPath.row]; cell.textLabel.numberOfLines = 0; cell.textLabel.lineBreakMode = NSLineBreakByWordWrapping; } - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { return UITableViewAutomaticDimension; }
Musimy zastosować te 2 zmiany.
1)cell.textLabel.numberOfLines = 0; cell.textLabel.lineBreakMode = NSLineBreakByWordWrapping; 2)return UITableViewAutomaticDimension;
źródło
Miałem również ten problem na początku, rozwiązałem swój problem z tego kodu, spróbuj uniknąć użycia
self.tableView.reloadData()
zamiast tego kodu dla dynamicznej wysokości[self.tableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationFade];
źródło
Używając statycznego
UITableView
, ustawiam wszystkie wartości wUILabel
s, a następnie wywołujętableView.reloadData()
.źródło
self.tableView.rowHeight = UITableViewAutomaticDimension self.tableView.estimatedRowHeight = 88.0
I nie zapomnij dodać dolnych ograniczeń dla etykiety
źródło
Swift 5 Ciesz się
tablev.rowHeight = 100 tablev.estimatedRowHeight = UITableView.automaticDimension func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = self.tablev.dequeueReusableCell(withIdentifier: "ConferenceRoomsCell") as! ConferenceRoomsCell cell.lblRoomName.numberOfLines = 0 cell.lblRoomName.lineBreakMode = .byWordWrapping cell.lblRoomName.text = arrNameOfRooms[indexPath.row] cell.lblRoomName.sizeToFit() return cell }
źródło
self.Itemtableview.estimatedRowHeight = 0; self.Itemtableview.estimatedSectionHeaderHeight = 0; self.Itemtableview.estimatedSectionFooterHeight = 0; [ self.Itemtableview reloadData]; self.Itemtableview.frame = CGRectMake( self.Itemtableview.frame.origin.x, self.Itemtableview.frame.origin.y, self.Itemtableview.frame.size.width,self.Itemtableview.contentSize.height + self.Itemtableview.contentInset.bottom + self.Itemtableview.contentInset.top);
źródło
Ustaw odpowiednie ograniczenie i zaktualizuj metody delegata jako:
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { return UITableViewAutomaticDimension } func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat { return UITableViewAutomaticDimension }
To rozwiąże problem z dynamiczną wysokością komórki. JEŚLI nie, musisz sprawdzić ograniczenia.
źródło