Мое приложение должно иметь ячейки таблицы с переменной высотой (как в каждой ячейке таблицы отличается по высоте, а не то, что каждая ячейка должна иметь возможность изменять ее размер).
У меня есть решение, которое в настоящее время работает, но оно kludgy и медленное.
Мое текущее решение:
Прежде чем отображать ячейки таблицы, я подсчитаю, насколько высокой должна быть каждая ячейка, вызывая методы определения размера, такие как -sizeWithFont:constrainedToSize:
в своих данных. Затем я добавляю высоту, допускаю некоторое заполнение и сохраняю результат с данными.
Затем, когда мой UITableViewDelegate получает -tableview:heightForRowAtIndexPath:
, я определяю, какой элемент будет отображаться для этой ячейки и вернуть высоту, которую я высчитал ранее.
Как я уже сказал, это работает, но вызов -sizeWithFont:constrainedToSize:
очень медленный, когда вы делаете это для сотен элементов последовательно, и я чувствую, что это можно сделать лучше.
Итак, для этого я должен был поддерживать две части кода - одну, которая вычисляла высоты ячеек, и тот, который на самом деле рисовал бы ячейки, когда придет время.
Если что-либо изменилось в отношении элемента модели, мне пришлось обновить оба этих фрагмента кода, и теперь они все еще не идеально подходят друг к другу, иногда приводя к тому, что ячейки таблицы немного слишком малы для заданного элемента, или слишком большой.
Мое предложение:
Поэтому я хочу покончить с предварительным вычислением высоты ячейки. A), потому что он нарушает парадигму MVC и B), потому что она медленная.
Итак, моя ячейка рисует себя и, как результат, заканчивается правильной высотой ячейки. Моя проблема заключается в том, что я не могу сказать, что таблица просматривает высоту ячейки до ее нарисования - к тому времени ее слишком поздно.
Я попытался вызвать -cellForRowAtIndexPath:
из -tableview:heightForRowAtIndexPath:
, но это застряло в бесконечном цикле, так как первый вызывает второй в какой-то момент и наоборот (по крайней мере, это то, что я видел, когда я его пробовал).
Итак, этот вариант не может быть и речи.
Если я не укажу размер в высоте для метода делегата row, тогда представление таблицы будет скрупулезным. Ячейки являются идеальной высотой, но их положение x - это ячейки фиксированных высот.
Ячейки со смешанной таблицей http://jamsoftonline.com/images/messed_table_cells.png
Обратите внимание, как нижняя ячейка имеет правильный размер - она просто перекрывает предыдущую ячейку, а предыдущая ячейка перекрывает ее предыдущую и т.д. и т.д.
Также, используя этот метод, при прокрутке есть некоторые артефакты, которые, как я думаю, могут быть связаны с идентификатором повторного использования для ячеек.
Поэтому любая помощь здесь была бы признательна.