0

Я рисую содержимое в UITableViewCell, и он работает хорошо, но я пытаюсь понять, есть ли лучший способ сделать это.Оптимизация чертежа на UITableViewCell

Каждая ячейка имеет следующие компоненты:

  • миниатюр на левой стороне - может прийти от сервера, так он загружен асинхронной
  • строка заголовка - переменной длины, чтобы каждая ячейка может быть разной высоты
  • Строка метки времени
  • Градиентный фон - градиент идет от верхней части ячейки до нижней части и является полупрозрачным, чтобы цвета фона блестели с помощью блеска

В настоящее время работает хорошо. Рисунок происходит следующим образом:

  • UITableViewController inits/повторно использует ячейку, наборы необходимых данных, и вызывает

    [клеток setNeedsDisplay]

  • клетка имеет CALayer для миниатюры - thumbnailLayer

  • В ячейке drawRect он рисует фон градиента и две строки

  • В drawRect ячейки затем вызывает setIcon - который получает миниатюру и задает изображение как содержимое файла thumbnailLayer. Если изображение не найдено локально, оно устанавливает загрузочное изображение в виде содержимого эскиза и асинхронно получает миниатюру. После того, как эскиз получен, он сбрасывается вновь & вызова SetIcon сбрасывает thumbnailLayer.contents

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

  • установки backgroundView ячейки на вид которой DrawRect бы сделать градиент так, чтобы DrawRect ячейки может нарисовать эскиз и использование setNeedsDisplayInRect позволит мне только перерисовывать миниатюру после он загрузился --- но это привело к рисованию (градиенту) backgroundView, покрывающему рисунок (текст) ячейки.

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

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

Любые идеи? Я уверен, что я что-то упустил, поэтому любая помощь будет отличной.

Bump - у кого есть идеи для этого?

ответ

0

Я начал использовать setNeedsDisplayInRect. Я все еще рисую все в drawRect, но когда я это делаю, я проверяю прямоугольник, который нужно рисовать, и только обновляем этот прямоугольник. Я также рисую с использованием CGLayers и сохраняю их как ivars. Когда мне нужно перерисовать раздел, который не изменился, я использую сохраненный CGLayer. Миниатюра больше не является CALayer. Для выбора чертежа мне придется использовать selectedBackgroundView и повторно использовать мои CGLayers.

0

Оба UIView и CALayer имеют непрозрачное свойство. Каждый раз, когда вы можете установить значение «ДА», композиция не будет, а рисование будет быстрее. Если у вашего миниатюрного изображения нет прозрачности, это идеальный кандидат.

Смежные вопросы