从UIView创建UIImage时出现非null无效上下文错误

时间:2012-04-25 04:30:08

标签: iphone uiview uiimage cgcontext

我正在使用以下内容从UIView生成UIImage

UIGraphicsBeginImageContextWithOptions(view.frame.size, YES, [[UIScreen mainScreen] scale]);
[view.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage* img = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

通常可以工作,但大约一半的时间,我在调用renderInContext时遇到此错误:

<Error>: CGContextDrawImage: invalid context 0x84d0b20

有没有人知道为什么会发生这种情况或如何检测它何时发生?如果上下文的地址是0x0,我想我会感觉更好,因为它至少是我可以测试和处理的东西,但到目前为止,这让我感到难过。

编辑:哎呀。意思是使用view.frame.size而不是view.bounds.size。

3 个答案:

答案 0 :(得分:5)

如果创建宽度或高度为零的上下文,则上下文将无效。如果视图大小为零,,如果视图为nil,则可能会发生这种情况。

此外,由于您正在渲染图层,因此您可能希望获得图层边界和比例,而不是视图边界屏幕比例< / em>的。大多数情况下,这些值都是相同的,但允许它们没有的时间是很好的。

// Debugging output to see how if an invalid context is being created due to zero size.
NSLog(@"View = %@", view);
NSLog(@"View size = %@", NSStringFromCGSize(view.bounds.size));

UIGraphicsBeginImageContextWithOptions(view.layer.bounds.size, YES, view.layer.contentsScale);
[view.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage* img = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

答案 1 :(得分:5)

我有一个类似的问题但是能够通过在我的图层渲染其内容之前推送和弹出图像上下文来解决它。

尝试这样的事情:

UIImage *snapshotImage = nil;
UIGraphicsBeginImageContextWithOptions(view.bounds.size, NO, view.layer.contentsScale);
{
    CGContextRef imageContext = UIGraphicsGetCurrentContext();

    if (imageContext != NULL) {
        UIGraphicsPushContext(imageContext);
        {
            [view.layer renderInContext:imageContext];
        }
        UIGraphicsPopContext();
    }

    snapshotImage = UIGraphicsGetImageFromCurrentImageContext();
}
UIGraphicsEndImageContext();

对于它的价值,有另外的(和更有效的)方法来获取快照,但它仍然在NDA下。

答案 2 :(得分:0)

UIGraphicsBeginImageContext(self.view.frame.size);
[self.view.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

希望,这会对你有帮助....