У меня плохая производительность при использовании эффекта тени

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

Но после того, как я применил эффект тени к этим изображениям, перетаскивание этого вида прокрутки имеет плохую производительность.

Я использовал методы shadowOpacity, shadowRadius и shadowOffset.

Пример:

[ [ anImageView layer ] shadowOpacity: 1.0 ];

При использовании эффекта тени эффект плохой производительности серьезно, я нарисую тень изображений напрямую.

Если есть какие-то советы по этим вопросам, сообщите мне об этом.

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

Спасибо за ваше чтение.

Ответ 1

См. CALayer.shouldRasterize (iOS 3.2+, но так же shadowOffset/etc):

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

Вероятно, вы также захотите установить растрированиеScale соответствующим образом.

Ответ 2

При использовании восстановленного слоя действительно повышается производительность, вы получите лучшие (более приятные) результаты, используя протуберант shadowpath, как предлагает @wayne-hartman.

Отметьте http://nachbaur.com/blog/fun-shadow-effects-using-custom-calayer-shadowpaths, как использовать теневой путь CALayer.

Ответ 3

Всякий раз, когда вы работаете с тенями, лучше использовать бежевый путь в качестве фона. Это поможет вам установить shadowPath, что резко повысит производительность. Rasterize улучшит производительность, но setShadowPath улучшит в 5 раз больше, чем просто установит растеризацию.

path = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(0, 0, 100, 100) cornerRadius:10];
[self.layer setShadowColor:[UIColor blackColor].CGColor];
[self.layer setShadowOpacity:1.0f];
[self.layer setShadowRadius:10.0f];
[self.layer setShadowPath:[path CGPath]];

Ответ 4

У меня была точно такая же проблема. Нарисовать тень - довольно дорогостоящая многопроходная операция, поэтому я могу ее понять, и я думаю, что тень рисуется непрерывно по мере прокрутки. Единственное, что я нашел, - это визуализировать тень вручную в изображении и отображать это изображение за изображениями в прокрутке. Кажется, что это хорошо работает.