最快的方式在iOS上做阴影?

QuartzCore .layer.shadow的吸收性能。 他们似乎需要每次改变时重新渲染,导致一切都滞后。

Coregraphics渐变(单向阴影) – 看起来不正确。 如果你的渐变从0.3阿尔法到0,它有一些奇怪的效果,你可以看到它停止。 这只是不好看,或自然。 也许它没有抖动,但我敢肯定,我听说核心graphics渐变是。 这很奇怪,我不知道。

Coregraphics阴影 – 需要一段时间才能渲染,但其他方面performance不错。 只是等待一个观点出现,因为它必须首先渲染阴影,这就是问题所在。

所以我一定会错过一些东西。 有没有另外一种方法看起来正确,并且在渲染时间和性能上都很快?

添加一个shadowPath会给你一个巨大的性能提升。 以下示例假定您只需要视图两侧的阴影

CGPathRef path = [UIBezierPath bezierPathWithRect:view.bounds].CGPath; [view.layer setShadowPath:path]; 

编辑:在默认情况下,CALayer在animation过程中绘制阴影,下面的代码允许您将阴影caching为位图,并重新使用它,而不是重绘它:

 self.view.layer.shouldRasterize = YES; // Don't forget the rasterization scale // I spent days trying to figure out why retina display assets weren't working as expected self.view.layer.rasterizationScale = [UIScreen mainScreen].scale; 

我经常看到人们使用巨大的性能影响视图的图层来创build一个圆angular或阴影。 像这样的东西:

 [v.layer setCornerRadius:30.0f]; [v.layer setBorderColor:[UIColor lightGrayColor].CGColor]; [v.layer setBorderWidth:1.5f]; [v.layer setShadowColor:[UIColor blackColor].CGColor]; [v.layer setShadowOpacity:0.8]; [v.layer setShadowRadius:3.0]; [v.layer setShadowOffset:CGSizeMake(2.0, 2.0)]; ..... 

这具有巨大的性能影响,特别是在影子。 把这样的观点放在一个UITableView中(或者事实上任何移动)都会创build一个android-ish滚动体验,你不需要这样做。 如果您需要animation或移动视图,请避免以任何方式创build圆angular或放下阴影!

满足核心graphics
我已经创build了一个简单的UIView子类来向您展示如何以稍微不同的方式实现相同的结果。 它使用Core Graphics绘制视图,与上面的代码相比,它不影响性能。

这是绘图代码:

 - (void)drawRect:(CGRect)rect { CGContextRef ref = UIGraphicsGetCurrentContext(); /* We can only draw inside our view, so we need to inset the actual 'rounded content' */ CGRect contentRect = CGRectInset(rect, _shadowRadius, _shadowRadius); /* Create the rounded path and fill it */ UIBezierPath *roundedPath = [UIBezierPath bezierPathWithRoundedRect:contentRect cornerRadius:_cornerRadius]; CGContextSetFillColorWithColor(ref, _fillColor.CGColor); CGContextSetShadowWithColor(ref, CGSizeMake(0.0, 0.0), _shadowRadius, _shadowColor.CGColor); [roundedPath fill]; /* Draw a subtle white line at the top of the view */ [roundedPath addClip]; CGContextSetStrokeColorWithColor(ref, [UIColor colorWithWhite:1.0 alpha:0.6].CGColor); CGContextSetBlendMode(ref, kCGBlendModeOverlay); CGContextMoveToPoint(ref, CGRectGetMinX(contentRect), CGRectGetMinY(contentRect)+0.5); CGContextAddLineToPoint(ref, CGRectGetMaxX(contentRect), CGRectGetMinY(contentRect)+0.5); CGContextStrokePath(ref); } 

看到这个博客: http : //damir.me/rounded-uiview-with-shadow-the-right-way