用它的孩子渲染UIView

时间:2009-04-25 10:29:15

标签: iphone uiview rendering

我有一个UIView,它有一个图像和一些按钮作为其子视图。我想使用renderInContext或其他方法获取它的“快照”图像。

[clefView.layer renderInContext:mainViewContentContext];

如果我将UIView(如上所述)传递给我,那么我会得到一个空白的位图。没有子项被渲染到位图中。

如果我传递了作为图像的子视图,那么我得到一个该位图的图像,并且毫不奇怪,没有它的兄弟(按钮)。

我有点希望renderInContext能够拍摄图像及其所有可见的孩子并将其渲染成位图。有没有人有任何想法如何做到这一点?

2 个答案:

答案 0 :(得分:35)

尝试这样的事情:

UIGraphicsBeginImageContext(clefView.bounds.size);
[clefView.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *resultingImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

答案 1 :(得分:0)

简单的4行版本对我不起作用。我有一个UIView(带子层)和一个子UITextView。我可以将UIView渲染到UIImage中,但是子UITextView不会被渲染。

我的简单解决方案如下:

CGRect rect = [view bounds];
UIGraphicsBeginImageContextWithOptions(rect.size, YES, 0.0f);
CGContextRef context = UIGraphicsGetCurrentContext();

[view.layer renderInContext:context];
for (UIView *sv in view.subviews)
{
    CGContextTranslateCTM(context, sv.frame.origin.x, sv.frame.origin.y);
    [sv.layer renderInContext:context];
    CGContextTranslateCTM(context, -sv.frame.origin.x, -sv.frame.origin.y);
}

UIImage *capturedImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

请注意,CGContextTranslateCTM的简单使用假定子视图除了转换之外没有其他转换。此外,我假设子视图完全包含在父视图框架中。