Оптимизация рисования на UITableViewCell - PullRequest
0 голосов
/ 02 апреля 2010

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

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

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

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

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

    [cell setNeedsDisplay]

  • В ячейке есть CALayer для миниатюры - thumbnailLayer

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

  • DrawRect ячейки тогда вызывает setIcon - который получает миниатюру и устанавливает изображение как содержимое thumbnailLayer. Если изображение не найдено локально, оно устанавливает загрузочное изображение как содержимое thumbnailLayer и асинхронно получает миниатюру. Как только миниатюра получена, она сбрасывается путем повторного вызова setIcon и сбрасывает thumbnailLayer.contents

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

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

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

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

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

Поднять - у кого-нибудь есть идеи для этого?

Ответы [ 2 ]

0 голосов
/ 14 апреля 2010

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

0 голосов
/ 14 апреля 2010

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

...