CALayer阴影使用renderInContext偏移太多以适应较小的上下文

时间:2011-08-26 08:41:15

标签: iphone calayer

我有一个UIView,UIViews作为子视图。这些子UIViews中的每一个都使用drawRect绘制图像,并且可以使用CALayer shadowOffset,shadowRadius,shadowOpacity创建阴影。

这一切都很棒,但我使用renderInContext拍摄了顶级UIView的缩略图。所有阴影都显示在距离UIView很远的地方。

这是正确的,因为阴影偏移,但我需要在renderInContext方法中使阴影偏移更小(或为零),因为缩略图上下文比UIView上下文小很多。

我可以将renderInContext渲染到一个大的上下文然后缩放,但是仪器显示大的上下文内存使用量在那么短的时间内跳跃3-4mb,内存很紧。

还有另一种方法可以达到这个目的吗?或者快速替代renderInContext方法来获取UIView层次结构的缩略图?


编辑: 我没有尝试使用CALayer shadowOffset,而是尝试在drawRect中使用CGContextSetShadowWithColor: - 这确实有效,但即使clipsToBounds设置为NO,也会剪切阴影。关于这种替代方案的任何想法?

感谢。

1 个答案:

答案 0 :(得分:1)

这个答案解决了这个问题: Getting a resized screenshot from a UIView

我一直在使用:

 thumbnailSize = CGSizeMake(PAGE_THUMB_HEIGHT, PAGE_THUMB_WIDTH);
 UIGraphicsBeginImageContext(thumbnailSize);
 CGContextScaleCTM(UIGraphicsGetCurrentContext(), thumbnailSize.width/viewToCapture.bounds.size.width, thumbnailSize.height/viewToCapture.bounds.size.height);
 [viewToCapture.layer renderInContext:UIGraphicsGetCurrentContext()];
 UIImage *flattenedImage = UIGraphicsGetImageFromCurrentImageContext();
 UIGraphicsEndImageContext();

但是UIGraphicsBeginImageContextWithOptions修复了它:

CGSize thumbnailSize = CGSizeMake(PAGE_THUMB_WIDTH, PAGE_THUMB_HEIGHT);
CGFloat scaleX =  thumbnailSize.width / viewToCapture.bounds.size.width;
CGFloat scaleY = thumbnailSize.height / viewToCapture.bounds.size.height;
UIGraphicsBeginImageContextWithOptions(viewToCapture.bounds.size, YES, scaleX > scaleY ? scaleY : scaleX);
[viewToCapture.layer renderInContext:UIGraphicsGetCurrentContext()];
 UIImage *flattenedImage = UIGraphicsGetImageFromCurrentImageContext();
 UIGraphicsEndImageContext();