Трюки для повышения производительности прокрутки iPhone UITableView? - PullRequest
89 голосов
/ 30 августа 2009

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

Я нашел следующие советы в блоге FieryRobot:

стекловидная прокрутка-с-UITableView

более-стекловидный прокрутки-с-UITableView

У кого-нибудь есть советы по улучшению производительности прокрутки в uitableview?

Ответы [ 5 ]

153 голосов
/ 30 августа 2009
  1. Кэшировать высоту строк (табличное представление может запрашивать это часто)
  2. Создать кэш с наименьшим количеством использовавшихся за последнее время изображений, используемых в таблице (и сделать недействительными все неактивные записи при получении предупреждения о памяти)
  3. Нарисуйте все в UITableViewCell drawRect:, если возможно, избегайте подпредставлений любой ценой (или, если вам требуется стандартная функциональность доступности, представление содержимого drawRect:)
  4. Сделайте слой UITableViewCell непрозрачным (то же самое относится и к представлению содержимого, если он у вас есть)
  5. Используйте функцию reusableCellIdentifier в соответствии с рекомендациями UITableView examples / Документация
  6. Избегайте градиентов / сложных графических эффектов, которые предварительно не запекаются в UIImage s
40 голосов
/ 30 августа 2009
  1. Если вы подкласс UITableViewCell, не используйте перо, вместо этого напишите это в коде. Это много быстрее, чем загрузка файлов Nib.
  2. Если вы используете изображения, убедитесь, что вы их кешируете, чтобы не делать должен загрузить из файла более один раз для каждого (если у вас есть память - вы будете удивлены, как много космических снимков занимают).
  3. Сделать столько элементов непрозрачными, сколько возможный. Точно так же, попробуйте и не используйте изображения с прозрачностью.
34 голосов
/ 26 октября 2009

Разработчик Tweetie много писал об этом и имеет некоторый код, который демонстрирует, как это было сделано для этого приложения. По сути, он / она защищает одно настраиваемое представление для каждой ячейки таблицы и рисует его вручную (вместо других подпрограмм с помощью Interface Builder, среди других вариантов).

быстрая прокрутка-в-Tweetie-с-UITableView

Кроме того, Apple обновила свой собственный пример кода для TableView в своих руководствах TableViewSuite (может быть, в ответ на это?)

TableViewSuite

1 голос
/ 27 июня 2014

# 1 Убийство производительности для прокрутки UITableView - рисование теней на любом слое вида ячеек, поэтому, если производительность прокрутки имеет значение, не делайте тени, если в основном это не замедляет ваш основной поток.

подумал, что это нужно сказать, поскольку ни в одном из принятых ответов не упоминаются тени и слои. : +)

0 голосов
/ 16 января 2016

Любая проблема с UITableView производительностью прокрутки может быть решена с использованием методов, уже описанных в других ответах. Однако во многих случаях вялое исполнение вызвано чем-то ошибочным или повторяющимся.

Тот факт, что UITableView повторно использует ячейки, и тот факт, что каждой ячейке может потребоваться свое собственное изображение - вместе делает решение немного сложным. Из того, как это решается в общем виде, здесь я суммирую вещи, о которых нужно позаботиться:

  1. Загрузка данных в источник данных - из REST / базы данных. Этот шаг должен быть выполнен в фоновом режиме, в конце концов, используя dispatch_async вместе с очередью GCD.
  2. Создание и инициализация соответствующих объектов модели данных и помещение их в массив
  3. [tableView reloaddata]
  4. Внутри cellForRowAtIndexPath, включите код, который будет устанавливать данные (текст) из правильного объекта модели данных массива.
  5. Теперь изображения могут быть также в форме URL, поэтому этот шаг может быть немного странным из-за повторного использования ячеек в табличном представлении. Суть в том, чтобы снова загрузить изображение из кэша / URL-адреса устройства с помощью асинхронной очереди, а затем установить для него правильное значение cell.image (независимо от того, какое свойство у вашего изображения ячейки).

Чтобы избежать проблем, обратитесь к этому уроку о отложенной загрузке изображений в табличном представлении.

...