heightForRowAtIndexPath вызывается для всех строк и сколько строк в UITableView до проблем с производительностью? - PullRequest
10 голосов
/ 16 марта 2011

Мне показалось, что я прочитал, что для UITableView этот heightForRowAtIndexPath вызывается не во всех строках, а только в тех, которые будут видны.Это не то, что я вижу, однако.Я вижу сотни звонков на heightForRowAtIndexPath для простой ситуации изменения ориентации iPhone, например.

Итак, я предполагаю, что для UITableView с heightForRowAtIndexPath он (то есть heightForRowAtIndexPath) вызывается для всех строк (не только для видимых) ... позвольте мнезнать, если это не совсем правильно.

ВОПРОС: Учитывая вышеизложенное, сколько строк в UITableView (где реализовано heightForRowAtIndexPath) может быть до того, как проблемы с производительностью возникают обычно?

Есть ли способ обойти проблемы с производительностью?т.е. установите номинальную / стандартную высоту для каждой строки и не реализуйте heightForRowAtIndexPath, но затем правильно установите каждую высоту строки только тогда, когда она отображается, и установите ее правильно здесь ... но в каком методе это можно сделать?

Ответы [ 4 ]

8 голосов
/ 16 марта 2011

Взгляните на раздел обсуждения в tableView:heightForRowAtIndexPath: документации

Метод позволяет делегату указывать строки с различной высотой.Если этот метод реализован, возвращаемое им значение переопределяет значение, указанное для свойства rowHeight UITableView для данной строки.

Существуют последствия для производительности при использовании tableView: heightForRowAtIndexPath: вместо свойства rowHeight .Каждый раз, когда отображается табличное представление, оно вызывает tableView: heightForRowAtIndexPath: для делегата для каждой из его строк, что может привести к значительной проблеме производительности с табличными представлениями, имеющими большое количество строк (приблизительно 1000 или более).

Таким образом, вы должны использовать свойство rowHeight UITableView.Если вам нужны разные высоты, вам не повезло, потому что вы должны использовать tableView:heightForRowAtIndexPath:.

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

3 голосов
/ 11 сентября 2015

Я думаю, что нашел решение для этого.

В 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

1 голос
/ 09 февраля 2016

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

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

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

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

1 голос
/ 17 апреля 2012

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

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

ИСПРАВИТЬ ЭТУ ЯБЛОКУ!

Приветствия

...