带投影的UIView - 应用renderInContext时速度慢

时间:2014-03-26 15:45:41

标签: ios objective-c uiview calayer uigraphicscontext

我使用UIViewUIImage的内容捕获到view.layer renderInContext:UIGraphicsGetCurrentContext()。视图为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 个答案:

答案 0 :(得分:1)

renderInContext: 慢。这就是iOS 7添加UIView快照方法(例如snapshotViewAfterScreenUpdates:)的原因。尽可能使用它们;它们要快得多。