带有阴影的 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 时速度很慢的主要内容,如果未能解决你的问题,请参考以下文章