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