使用子视图创建新视图,获取图形上下文会破坏原始视图?

时间:2012-10-07 22:45:47

标签: iphone xcode image uiview

我希望这个标题有道理。

我有UIView(在IB中创建)我添加东西(图像)。然后,我有一个带有一些文字的UILabel。现在,我想制作一个UIImage,我喜欢这样:

UIView *comp = [[UIView alloc] initWithFrame:self.previewView.frame];
    [comp addSubview:self.previewView];
    [comp addSubview:self.lblCaption];

    UIGraphicsBeginImageContextWithOptions(comp.bounds.size, NO, 1.0);
    [comp.layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

self.previewView和self.lblCaption都是在IB中创建的。 previewView只是一个屏幕填充视图。

按钮点击后,代码块在IBAction中执行。

哪个效果很好,我按预期获得图像并可以进一步处理。

但在那之后,«self.previewView»的内容消失了?当我做一个NSLog时,一切似乎都在那里,但它在屏幕上不再可见。

有谁知道这里发生了什么?

[编辑]

如下面的答案所述,视图之前被添加到self.view中,所以当我将它添加到comp时它被删除了。解决方案非常简单,实际上,我将代码更改为以下内容:(创建了一个返回UIImage的函数。这比在代码中执行它更清晰。

-(UIImage *)imageFromView:(UIView *)theView andLabel:(UILabel *)theLabel{

    UIGraphicsBeginImageContextWithOptions(comp.bounds.size, NO, 1.0);
    [theView.layer renderInContext:UIGraphicsGetCurrentContext()];
    [theLabel.layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    return viewImage;
}

1 个答案:

答案 0 :(得分:1)

我只是猜测假设可能的情况......

假设您在其他视图上显示self.previewView,请说self.view

self.previewView添加到comp后,它可能已从self.view中删除。 (考虑到UIView.superview只是单个实例,我认为这很可能)。

如果是这种情况,请在获取图片后将self.previewView重新添加到self.view以解决问题。