2013-07-27 2 views
3

Я работаю над iPhone-приложением, которое будет отображать большую прокручиваемую и масштабируемую поверхность, содержащую сетку изображений и текстовых надписей над ними. Мне нужно иметь возможность изменять положение изображений по отдельности и контролировать уровень прозрачности меток. Я попытался выполнить эти цели, используя UIScrollView и Core Animation.Плавная прокрутка UIScrollView с прозрачными CALayers

Подраздел UIScrollView содержит два основных подслоя: один для отображения изображений и один для этикеток. Фотографии CALayers с их содержимым, установленным на CGImage, и они добавляются в качестве подслоев к слою изображений. Ярлыки: CATextLayers, и они являются подслоями второго слоя. Прозрачность слоя этикеток изменяется в зависимости от масштаба масштабирования вида прокрутки.

И вот проблема: все работает отлично, когда этикетки полностью непрозрачные или полностью прозрачные, но когда они полупрозрачен скроллинг начинает быть вялеными и FPS падает до 35. Очевидно смешиванием этих слоев замедляет все , но я не мог найти способ исправить это. Буду признателен за любые идеи о том, как улучшить производительность в этой ситуации. Может быть, есть лучший способ рисовать текстовые метки, чем использоватьCATextLayer?

ответ

0

Возможно ли, чтобы вы объединили два «основных слоя» вашего UIScrollView в один? Кроме того, можно ли добавлять слои непосредственно на слой UIScrollView вместо добавления дополнительных?

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

+0

Я сохраняю метки на отдельном слое, чтобы сразу настроить каждую из них. Но я попытаюсь добавить изображения непосредственно на слой подсмотра scrollview и посмотреть, помогает ли это, спасибо за советы. –

+0

А, я вижу. В конце концов, это сводится к попыткам разных вещей, потому что проблемы с производительностью всегда ситуативны. Тем не менее, я бы предположил, что Objective C fast enumeration + настройка альфа индивидуально быстрее, чем наличие слоя в контейнере и изменение непрозрачности (у вас будет один слой для смешивания).В любом случае, дайте мне знать, если у вас есть другие вопросы. –

-1

Одним из решений является добавление тени к большинству фоновых слоев как слоя изображения, так и текстового слоя.

Есть ряд теневых свойств, которые вы можете изменить то shadowPath, shadowColor, shadowOffset и shadowRadius - установить каждый из них, не пропустите ни одного. Также установите yourlayer.masksToBounds = NO.

Не забудьте добавить yourlayer.shouldRasterize = YES, потому что это будет иметь лучшее влияние на производительность.

+0

Почему добавление тени, когда ему даже не нужны тени, увеличивает производительность? И как вы знаете, должен ли Rasterize повысить производительность в этом сценарии? Он может быть недействительным по какой-либо причине при масштабировании. –

+0

тень (даже ширины, например 0,01) удаляет зубчатые края, что, возможно, так же, как ОП описывает его как «начинает отрываться». Я использовал тень для более гладких вещей. Растеризация лучше влияет на производительность. Насколько вы кэшируете каждый слой, который будет перерисовываться при прокрутке - это хорошо. Смотрите это: http://stackoverflow.com/questions/11521959/uiview-self-layer-shouldrasterize-yes-and-performance-issues. Будьте осторожны, прежде чем сверлить человека. –

+0

Под «отрывистым» я имел ввиду низкий FPS во время прокрутки, извините, если не ясно. Я экспериментировал с 'shouldRasterize', но, к сожалению, это не помогло в моем случае. Растеризация отдельных изображений и/или ярлыков не имеет никакого значения, а растрирование всего представления делает прокрутку еще медленнее и вызывает мерцание, когда отображаются части растрового изображения. –

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

  • Нет связанных вопросов^_^