HeightFororyAtIndexPath призван ко всем рядам и сколько строк в UitableView перед проблемами производительности?
-
25-10-2019 - |
Вопрос
Я думал, что прочитал это для UITableView
что heightForRowAtIndexPath
Не обращаются на все ряды, но только на тех, которые будут видны. Это не то, что я вижу, однако. Я вижу сотни звонков heightForRowAtIndexPath
для простой ситуации, например, на iPhone, была изменена ориентация.
Так что я предполагаю здесь, что для UITableView
с heightForRowAtIndexPath
реализовано, это так (т.е. heightForRowAtIndexPath
) Пригласить на все строки (не только видимые) ... дайте мне знать, если это не совсем правильно.
Вопрос: Учитывая вышеизложенное, сколько строк в UITableView
(куда heightForRowAtIndexPath
Реализируется) Можете ли у вас возникнуть до того, как проблемы с производительностью обычно возникнут?
Есть ли способ обойти проблемы с производительностью? т.е. установите номинальную/стандартную высоту для каждой строки и не реализуйте heightForRowAtIndexPath
, но затем правильно установите каждую высоту строки только тогда, когда она отображается, и правильно установите ее ... но в каком методе это будет делать это?
Решение
Взглянуть на раздел обсуждения в tableView:heightForRowAtIndexPath:
документация
Метод позволяет делегату указать строки с различной высотой. Если этот метод реализован, значение, которое он возвращает, переопределяет значение, указанное для свойства Rowheight UitableView для данной строки.
Существуют последствия для использования TableView: HeightFororaTIndexPath: вместо свойства Rowheight. Анкет Каждый раз, когда отображается представление о таблице, он вызывает TableView: HeightFororyAtIndexPath: на делегате для каждого из его строк, что может привести к значительной проблеме производительности с видами таблицы с большим количеством рядов (приблизительно 1000 или более).
Итак, вы должны использовать rowHeight
Собственность UitableView. Если вам нужны разные высоты, вам не повезло, потому что вам нужно использовать tableView:heightForRowAtIndexPath:
.
Afaik нет способа изменить высоту ряда на выставке.
Табличный обзор должен знать правильный размер раньше, что все время будет постоянно сдвигаться положения.
Другие советы
Я думаю, что нашел решение для этого.
В iOS 7 Apple представила некоторые новые свойства таблицы. Один из них - это:
tableView:estimatedHeightForRowAtIndexPath:
Так что, например, если вы поставляете расчетную высоту строки, то, когда TableView: HeightForrowAtIndexPath: вызывает неоднократно до отображения таблицы, она называется только для видимых ячеек таблицы; Для оставшихся ячеек используется расчетная высота.
Боже мой, я провел более часа, пытаясь найти источник моей проблемы с производительностью!
Наконец, я также нашел сотни вызовов в HightForroborAtIndexPath, и поиск получил мне эту ветку. Это действительно раздражает. Производительность уже идет здесь, когда просто отображает 250 предметов. К счастью, ячейки, которые я хочу отображать, теперь имеют одинаковый размер. Но я мог бы представить, что кто -то хочет отобразить несколько ячеек для обзора таблицы с> 200 элементами!
Исправьте это яблоко!
Ваше здоровье
Способ повысить производительность в таблице с большим количеством рядов и динамических высот ячейки заключается в кэшировании высоты ячеек, как только они сначала рассчитаны.
Упрощенный подход к достижению этого - сохранить NSMutableDictionary
в котором ключ - это идентификатор записи в ячейке (или любой другой идентификатор, который у вас может иметь), а значение - это NSNumber
с высотой ряда. Как только высота сначала рассчитана, сохраните NSMutableDictionary
по идентификатору записи. в tableView:heightForRowAtIndexPath
а также tableView:estimatedHeightForRowAtIndexPath:
Вы проверяете на наличие кэшированной высоты в словаре и возвращаете ее, если найдено. Если не найдено, вычислите высоту и храните в кэше, прежде чем вернуть высоту.
Возможно, вам придется быть осторожным с аннулированием кеша для рядов, которые изменяют высоту. Например, если у вас есть кнопка расширения в одной из ваших ячеек, вам нужно будет удалить высоту этой ячейки из кэша после того, как кнопка развернута будет вызвать метод делегата для высоты для высоты.
У вас все еще может быть удар производительности, если вы попытаетесь отобразить 1000 ячеек одновременно, когда таблица показывает, как это, вероятно, вызовет метод высоты для каждой строки. Работа для этого состоит в том, чтобы сначала согреть кэш, если это возможно, в фоновой задаче, прежде чем сначала отображать ячейки.