QuartzCore .layer.shadow的吸了性能。 他们似乎需要重新渲染每次都会有一些变化,引起的一切滞后。
CoreGraphics在梯度(1路阴影) - 看起来不正确的。 如果您的梯度从0.3阿尔法变为0,它有一些奇怪的效果,即可以“看”它停下来。 它只是不好看,或自然。 也许它没有抖动,但我敢肯定,我听到了核芯显卡的梯度。 很奇怪,我不知道。
CoreGraphics在阴影 - 需要一段时间才能呈现为您设置,但在其他方面性能卓越。 这只是第二你等待视图出现,因为它呈现它的身影第一次,这就是问题所在。
所以我必须失去了一些东西。 有没有看起来的权利,既渲染时间和性能的快速另一种方法?
添加shadowPath应该给你一个巨大的性能提升。 下面的例子假设你只需要在您的视图两侧的阴影
CGPathRef path = [UIBezierPath bezierPathWithRect:view.bounds].CGPath;
[view.layer setShadowPath:path];
编辑:在默认情况下,CALayer的动画期间仅消耗了一层阴影,下面的代码允许高速缓存阴影为位图和重用它,而不是重新绘制的:
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;
我经常看到用巨大的性能的影响观点的层来创建一个圆角或阴影效果的人。 事情是这样的:
[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(或事其实任何动作)将创建一个Android十岁上下滚动的经验,你不希望出现这种情况。 如果您需要动画或移动视图,避免以任何方式创建圆角或类似这样的阴影!
符合核芯显卡
我创建了一个简单的UIView子类向您展示如何实现相同的结果稍有不同的方式。 它采用核芯显卡在相反的观点,并提请上面的代码,它不会影响性能。
这里的绘图代码:
- (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