为什么报告上下文无效?
<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模拟器。
答案 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);
。