HeightFororyAtIndexPath призван ко всем рядам и сколько строк в UitableView перед проблемами производительности?

StackOverflow https://stackoverflow.com/questions/5324205

Вопрос

Я думал, что прочитал это для 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: вызывает неоднократно до отображения таблицы, она называется только для видимых ячеек таблицы; Для оставшихся ячеек используется расчетная высота.

Вот источник этой информации: https://books.google.gr/books?id=wLaVBQAAQBAJ&pg=PT521&lpg=PT521&dq=heightforrowatindexpath+only+for+the+visible+cells&source=bl&ots=7tuwaMT5zV&sig=h3q8AaFvoCgcrPu2fQchVkIEjwg&hl=en&sa=X&ved=0CEMQ6AEwBWoVChMInLK0xbPuxwIVCbUaCh3_nQWG#v=onepage&q=heightforrowatindexpath% 20only%20for%20the 20visible%20cells & f = false

Боже мой, я провел более часа, пытаясь найти источник моей проблемы с производительностью!

Наконец, я также нашел сотни вызовов в HightForroborAtIndexPath, и поиск получил мне эту ветку. Это действительно раздражает. Производительность уже идет здесь, когда просто отображает 250 предметов. К счастью, ячейки, которые я хочу отображать, теперь имеют одинаковый размер. Но я мог бы представить, что кто -то хочет отобразить несколько ячеек для обзора таблицы с> 200 элементами!

Исправьте это яблоко!

Ваше здоровье

Способ повысить производительность в таблице с большим количеством рядов и динамических высот ячейки заключается в кэшировании высоты ячеек, как только они сначала рассчитаны.

Упрощенный подход к достижению этого - сохранить NSMutableDictionary в котором ключ - это идентификатор записи в ячейке (или любой другой идентификатор, который у вас может иметь), а значение - это NSNumber с высотой ряда. Как только высота сначала рассчитана, сохраните NSMutableDictionary по идентификатору записи. в tableView:heightForRowAtIndexPath а также tableView:estimatedHeightForRowAtIndexPath: Вы проверяете на наличие кэшированной высоты в словаре и возвращаете ее, если найдено. Если не найдено, вычислите высоту и храните в кэше, прежде чем вернуть высоту.

Возможно, вам придется быть осторожным с аннулированием кеша для рядов, которые изменяют высоту. Например, если у вас есть кнопка расширения в одной из ваших ячеек, вам нужно будет удалить высоту этой ячейки из кэша после того, как кнопка развернута будет вызвать метод делегата для высоты для высоты.

У вас все еще может быть удар производительности, если вы попытаетесь отобразить 1000 ячеек одновременно, когда таблица показывает, как это, вероятно, вызовет метод высоты для каждой строки. Работа для этого состоит в том, чтобы сначала согреть кэш, если это возможно, в фоновой задаче, прежде чем сначала отображать ячейки.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top