CGContextSaveGState:UIGraphicsBeginImageContextWithOptions之后的无效上下文0x0

时间:2014-07-21 22:56:16

标签: ios uigraphicscontext

为什么报告上下文无效?

<Error>: CGContextSaveGState: invalid context 0x0. This is a serious error.
This application, or a library it uses, is using an invalid context and is
thereby contributing to an overall degradation of system stability and
reliability. This notice is a courtesy: please fix this problem. It will
become a fatal error in an upcoming update.

在UIImage上的类别方法中调用drawInRect时会发生这种情况:

- (UIImage *)myImagePaddedToSize:(CGSize)newSize {
    UIGraphicsBeginImageContextWithOptions(newSize, NO, 0.0);
    CGSize oldSize = self.size;

    CGRect rect = (CGRect){
        {
            floorf((newSize.width-oldSize.width)/2),
            floorf((newSize.height-oldSize.height)/2)
        },
        oldSize
    };
    [self drawInRect:rect];
    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return newImage;
}

我的理解是UIGraphicsBeginImageContextWithOptions建立了我吸引的背景。这似乎通常是关心,但很少我得到这种失败。

这是Xcode 5.1.1附带的iOS 7模拟器。

1 个答案:

答案 0 :(得分:4)

(最初,我认为这是How can I fix CGContextRestoreGState: invalid context 0x0的欺骗。事实并非如此;消息不同,而且这个消息很容易解决。)

如果发生此错误,newSize的{​​{1}}和/或height为0(或为负数)。

在这种情况下,

width失败,但它的形状不会导致它返回错误。 (没有返回或结果。)因此,只要您尝试在无法创建的上下文中绘制,就会收到此错误。

要测试此项,请添加几行:

UIGraphicsBeginImageContextWithOptions

试一试。我猜测它会在几分钟的测试中崩溃。

如果确实发生了这种情况,你会想要一个永久性修复,而不是这样:

- (UIImage *)myImagePaddedToSize:(CGSize)newSize {
    NSParameterAssert(newSize.width > 0);
    NSParameterAssert(newSize.height > 0);
    UIGraphicsBeginImageContextWithOptions(newSize, NO, 0.0);

我们的想法是您无法将图片填充为零或负尺寸,因此只需返回- (UIImage *)myImagePaddedToSize:(CGSize)newSize { if ((newSize.width <= 0) || (newSize.height <= 0)) { return nil; } UIGraphicsBeginImageContextWithOptions(newSize, NO, 0.0);