То, как Apple реализует UITableView, не является интуитивно понятным для всех, и легко понять значение heightForRowAtIndexPath:
. Общее намерение состоит в том, что это более быстрый и легкий метод памяти, который можно вызывать для каждой строки в таблице довольно часто. Это отличается от cellForRowAtIndexPath:
, который часто медленнее и требует больше памяти, но вызывается только для строк, которые действительно должны отображаться в любой момент времени.
Почему Apple реализует это так? Одной из причин является то, что почти всегда дешевле (или может быть дешевле, если вы правильно его кодируете) вычислить высоту строки, чем построить и заполнить целую ячейку. Учитывая, что во многих таблицах высота каждой ячейки будет одинаковой, она зачастую значительно дешевле. И другая часть причины заключается в том, что iOS необходимо знать размер всей таблицы: это позволяет ей создавать полосы прокрутки и настраивать их в представлении прокрутки и т. Д.
Таким образом, если высота каждой ячейки не одинакова, то при создании UITableView и при отправке ему сообщения reloadData источнику данных отправляется одно сообщение heightForRowAtIndexPath для каждой ячейки. Так что если в вашей таблице 30 ячеек, это сообщение будет отправлено 30 раз. Скажем, только шесть из этих 30 ячеек видны на экране. В этом случае при создании и при отправке ему сообщения reloadData UITableView отправит одно сообщение cellForRowAtIndexPath на видимую строку, то есть это сообщение будет отправлено шесть раз.
Некоторые люди иногда ломают голову над тем, как рассчитать высоту ячейки, не создавая сами представления . Но обычно это легко сделать.
Например, если высота строк различается по размеру, поскольку в них содержится различное количество текста, вы можете использовать один из методов sizeWithFont:
в соответствующей строке для выполнения вычислений. Это быстрее, чем создание представления и последующее измерение результата. Обратите внимание, что если вы измените высоту ячейки, вам нужно будет либо перезагрузить всю таблицу (с помощью reloadData - это будет запрашивать у делегата каждую высоту, но только запрашивать видимые ячейки) ИЛИ выборочно перезагружать строки, где размер имеет изменен (который, в прошлый раз, когда я проверял, также вызывает heightForRowAtIndexPath:
в каждой строке , но также выполняет некоторую прокрутку для хорошей меры).
См. этот вопрос и, возможно, также этот .