带有阴影的 UIView - 应用 renderInContext 时速度很慢

Posted

技术标签:

【中文标题】带有阴影的 UIView - 应用 renderInContext 时速度很慢【英文标题】:UIView with drop shadow - slow when applying renderInContext 【发布时间】:2014-03-26 15:45:40 【问题描述】:

我正在使用view.layer renderInContext:UIGraphicsGetCurrentContext()UIView 的内容捕获到UIImage 中。视图是UICollectionView,我通过以下方式为每个单元格添加了阴影:

cell.layer.masksToBounds = NO;
cell.layer.shadowOpacity = 0.75f;
cell.layer.shadowRadius = 3.0f;
cell.layer.shadowOffset = CGSizeZero;
cell.layer.shadowPath = [UIBezierPath bezierPathWithRect:cell.bounds].CGPath;
cell.layer.shouldRasterize = YES;

转换为UIImage 如下:

UIGraphicsBeginImageContextWithOptions(view.frame.size, 0, 0);
[view.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

问题在于,虽然单元格的初始显示似乎足够快,但当我捕获视图的快照时,添加阴影会使性能降低 10-30 倍,具体取决于阴影半径。在 iPad 2 上,它从没有阴影的 70 毫秒变为有 3px 阴影的整整 2 秒!

我已经读到设置layer.shadowPath 应该有助于提高性能,但我实际上并没有看到任何明显的速度差异,无论是否设置。

在这种情况下,我可以做些什么来加快快照的渲染速度?不能保证单元格是任何特定大小,所以很遗憾我不能使用预渲染图像来伪造阴影效果。

【问题讨论】:

【参考方案1】:

renderInContext: 慢。这就是为什么 ios 7 添加了 UIView 快照方法(例如snapshotViewAfterScreenUpdates:)。尽可能使用它们;它们的速度要快得多。

【讨论】:

这是一个很棒的提示!我想 iOS 6 运气不好? 我相信是的。不过,有一些关于绘图性能的 WWDC 视频;你可能想花一些时间和他们在一起,看看他们是否提供了任何有用的想法。

以上是关于带有阴影的 UIView - 应用 renderInContext 时速度很慢的主要内容,如果未能解决你的问题,请参考以下文章

带有圆角和阴影的 UIView?

带有圆角和阴影的 UIView?

带有切出段和阴影的 UIView

拖动带有阴影的自定义 UIView - 大小重置和阴影消失

带有渐变和阴影的 UIView

如何为带有阴影的 UIView 赋予椭圆形状