Выбор ответа Senior UIKit обновлено

Тени и скругления в списках

Вопрос

Скролл ленты дёргается. В ячейках у картинки cornerRadius + masksToBounds, а у карточки тень без shadowPath. Что исправить в первую очередь?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Задать shadowPath, чтобы тень не считалась по содержимому каждый кадр. Тень без shadowPath заставляет Core Animation вычислять форму по содержимому слоя, это offscreen-проход на каждый кадр.

Варианты ответа

  1. Убрать cornerRadius: скругления всегда дают offscreen-рендеринг
  2. Перенести создание ячеек в фоновый поток, чтобы разгрузить главный
  3. Задать shadowPath, чтобы тень не считалась по содержимому каждый кадрправильный ответ
  4. Увеличить estimatedRowHeight, чтобы реже пересчитывать высоты

Разбор

Тень без shadowPath заставляет Core Animation вычислять форму по содержимому слоя, это offscreen-проход на каждый кадр. Явный shadowPath (например, из UIBezierPath(roundedRect:cornerRadius:)) убирает эту работу. Простой cornerRadius с masksToBounds на современных iOS обычно оптимизирован, хотя комбинации масок могут стоить дорого. UIKit-объекты нельзя создавать в фоне. Высота строк влияет на прокрутку иначе. Диагностика: Instruments Core Animation и подсветка offscreen-рендеринга в симуляторе.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.