2015-06-02 4 views
1

У меня есть UIScrollView, который в значительной степени функционирует как Facebook лента новостей. Я думал, что мои элементы замедляют прокрутку fps. По способу устранения я обнаружил, что тени замедляют мое приложение.Shadows slow up UIScrollView

В UIView коробки внутри вида прокрутки имеют такую ​​конфигурацию:

self.layer.shadowColor = UIColor.blackColor().CGColor 
self.layer.shadowOffset = CGSizeMake(0, 2) 
self.layer.shadowRadius = 2 
self.layer.shadowOpacity = 0.15 

Как ленту новостей, на мой взгляд прокрутки имеет много коробок, поэтому имея UIView с с их собственной тени. Как мне пойти с этим без замедления моего приложения?

+1

self.layer.shouldRasterize = YES; – MDB983

+0

Это сработало, и все ускорилось. Однако все подпункты (в основном 'UILabel's) стали размытыми. – ton

ответ

3

Там куча вещей на ускоряя UIScrollViews:

Если вы используете пользовательские экземпляры CALayer - особенно с тенями - материал, который требует мощности обработки, вы должны использовать

scrollView.layer.shouldRasterize = YES; 
scrollView.layer.rasterizationScale = [UIScreen mainScreen].scale; 

Также shadowPath может ускорить ваш Scrollview, а что-то вроде этого:

[scrollView.layer setShadowPath:[[UIBezierPath bezierPathWithRect:myView.bounds] CGPath]]; 

Установки shadowPath позволяет IOS не пересчитывать, как она должна сделать Теневую каждый раз, когда он черпает представление, тем самым повышая производительность.

В быстры, что-то вроде этого:

let shadowPath = UIBezierPath(rect: view.bounds); 
view.layer.masksToBounds = false; 
view.layer.shadowColor = UIColor.blackColor().CGColor; 
view.layer.shadowOffset = CGSizeMake(0, 0.5); 
view.layer.shadowOpacity = 0.2; 
view.layer.shadowPath = shadowPath.CGPath; 
+0

Вы бы сказали, что '.shouldRasterize' и' .rasterizationScale' достаточно? Не могли бы вы также написать эквивалент Swift для кода (особенно строка 'setShadowPath')? Благодаря! – ton

1

Установка shadowPath улучшит производительность и будет выглядеть так же, пока ваши взгляды непрозрачны. Вы можете просто установить его в пределы вида или слоя, как так:

CGPathRef shadowPath = CGPathCreateWithRect(self.bounds, NULL); 
self.layer.shadowPath = shadowPath; 
CGPathRelease(shadowPath); 

В Swift:

layer.shadowPath = CGPathCreateWithRect(bounds, nil) 

Управление памятью осуществляется для вас (обсуждается here).

+0

Не могли бы вы написать эквивалент Swift, пожалуйста? Особенно линия с 'CGPathRelease'. Спасибо! – ton