Moja aplikacja musi mieć komórki tabeli o zmiennej wysokości (ponieważ każda komórka tabeli różni się wysokością, a nie każda komórka musi mieć możliwość zmiany rozmiaru).Jak prawidłowo wykonać komórki tabeli o zmiennej wysokości na iPhonie?
Mam rozwiązanie, które obecnie działa, ale jest kludgy i powolne.
Moje obecne rozwiązanie:
Przed komórki tabeli są renderowane, obliczyć jak wysokie każda komórka musi być przez wywołanie metody wymiarowania takich jak -sizeWithFont:constrainedToSize:
na jego danych. Następnie sumuję wysokości, pozwalam na dopełnienie i przechowuję wynik z danymi.
Kiedy mój UITableViewDelegate otrzyma -tableview:heightForRowAtIndexPath:
, ustalam, który element zostanie wyrenderowany dla tej komórki i zwróci wysokość, którą obliczałem poprzednio.
Jak już powiedziałem, to działa, ale wywołanie -sizeWithFont:constrainedToSize:
jest bardzo powolne, gdy robisz to dla setek elementów sekwencyjnie i czuję, że można to zrobić lepiej.
Aby to zadziałało, musiałem utrzymać dwie części kodu - jedną, która obliczy wysokość komórek, i taką, która faktycznie narysuje komórki, gdy nadejdzie czas.
Jeśli coś zmieniło się w modelu, musiałem zaktualizować oba te fragmenty kodu, i od czasu do czasu wciąż nawet nie pasują idealnie, czasami powodując, że komórki tabeli są nieco zbyt małe dla danego przedmiot lub zbyt duży.
My Proponowane rozwiązanie:
Więc chcę pozbyć się precalculating wysokość komórek. A), ponieważ łamie paradygmat MVC i B), ponieważ jest powolny.
Moja komórka rysuje się, w wyniku czego uzyskuje prawidłową wysokość komórki. Mój problem polega na tym, że nie mam możliwości powiedzieć tabeli, jaka jest wysokość komórki przed jej narysowaniem - do tego czasu jest już za późno.
Próbowałem wywoływać -cellForRowAtIndexPath:
z poziomu -tableView:heightForRowAtIndexPath:
, ale utknie w nieskończonej pętli, ponieważ pierwszy wywołuje sekundę w pewnym momencie, i na odwrót (przynajmniej to, co widziałem, gdy próbowałem go).
Ta opcja nie wchodzi w grę.
Jeśli nie określiłem rozmiaru na wysokości dla metody delegata wiersza, to widok tabeli przechodzi na rubwy. Komórki mają idealną wysokość, ale ich x jest pozycją komórek o stałych wysokościach.
Messed Table Cells http://jamsoftonline.com/images/messed_table_cells.png
Wskazówki jak dolna komórka jest prawidłowy rozmiar - to tylko nakładających poprzednią komórkę, a poprzedni komórka pokrywa jej poprzednią, i tak dalej i tak dalej.
Stosując tę metodę podczas przewijania pojawia się kilka artefaktów, które mogą być związane z identyfikatorem ponownego użycia dla komórek.
Więc jakakolwiek pomoc tutaj byłaby wdzięcznie doceniona.
mam ten sam problem. -cellForRowAtIndexPath: wywołania -tableView: heightForRowAtIndexPath: jeśli wywoływana w tym drugim (zauważ, że nie wywołuje tego ostatniego, jeśli nie jest wywoływana w drugim), doprowadzam mnie do szału. – an0