CALayer теряет растеризацию при прокрутке вне экрана в UIScrollView - PullRequest
5 голосов
/ 16 февраля 2012

У меня есть несколько хороших пользовательских UIViews, которые используют CALayers для некоторых довольно сложных масок и прозрачных пленок.Мне потребовалось некоторое время, чтобы выяснить, как заставить его работать гладко, но я обнаружил, что, оборачивая соответствующие объекты в контейнер UIView и устанавливая значение параметра layer.shouldRasterize контейнера в YES, но оставляя этому свойству всех содержащихся представлений значение NO., он будет работать плавно, независимо от того, насколько сложным может быть ваше смешивание.

Это в основном так:

UIScrollView


Просмотр контейнера (layer.shouldRasterize = YES)

  • child (layer.shouldRasterize = NO)
    • childOfChild (layer.shouldRasterize = NO)
  • child (layer.shouldRasterize =NO)
  • child (layer.shouldRasterize = NO)

Container ...

Container ... (и т. Д.)


По сути, контейнер растеряется как одно большое изображение блока при растеризации, сводя к минимуму количество растеризации, которое необходимо выполнить.Тем не менее, это создало новую проблему для меня.Если у меня есть несколько контейнеров в UIScrollView, как только один из контейнеров прокручивается за пределами экрана, он помечается как «Красный» в профилировщике CoreAnimation и, следовательно, должен снова отображаться при прокрутке назад на экране.Это вызывает краткое заикание.Я не понимаю, почему слой контейнера должен снова растеризоваться.Может кто-нибудь объяснить это или, возможно, предоставить обходной путь?Спасибо.

1 Ответ

0 голосов
/ 01 июня 2013

Вы можете сохранить изображение вашего слоя (при условии, что оно не изменится после рендеринга), а затем просто прокрутить между Static UIImages.

Чтобы создать UIImage из CALayer, попробуйте решение Тодда Янделла:

UIImage от CALayer - iPhone SDK

или для создания UIImage из UIView попробуйте решение Томми:

Как записать UIView в UIImage без потери качества на дисплее сетчатки

...