绘制 UIImage 时出现无效的上下文错误
Posted
技术标签:
【中文标题】绘制 UIImage 时出现无效的上下文错误【英文标题】:invalid context error when drawing a UIImage 【发布时间】:2011-10-04 02:31:58 【问题描述】:我正在尝试将 UIImage 绘制到我的 UIView 的上下文中。我已经将这段代码与上下文内容一起使用了注释进出...
- (void)drawRect:(CGRect)rect
//UIGraphicsBeginImageContextWithOptions(rect.size,YES,[[UIScreen mainScreen] scale]);
//UIGraphicsBeginImageContext(rect.size);
UIImage *newImage = [UIImage imageNamed:@"character_1_0001.png"];
//[newImage drawAtPoint:CGPointMake(200, 200)];
[newImage drawInRect:rect];
//UIGraphicsEndImageContext();
据我了解,我不需要设置图像上下文来执行此操作,实际上如果没有它,我确实会看到在视图中绘制的图像,但我也在日志中收到此错误...
<Error>: CGContextSaveGState: invalid context 0x0
如果我取消注释 UIGraphicsBeginImageContext 行,我不会绘制任何内容,也不会出现错误。
我是否需要使用默认的图形上下文并以某种方式声明它?
我需要绘制图像,因为我想在上下文中添加图像并且不能只生成 UIImageView 对象的负载。
【问题讨论】:
您必须在其他地方有一些其他代码正在调用 CGContextSaveGState?你是说只有UIImage=
和drawInRect
行,你会得到这个错误?
如果我取消注释该代码中的上下文行,我不会收到错误消息,但在我的视图中看不到任何内容。因为它是我看到我的图像被绘制但得到上下文错误。很奇怪。
而且你自己不在其他任何地方调用 CGContextSaveGState 吗?
不。我现在正在测试这个。将尝试仅绘制一些文本。
另外,你不会直接打电话给drawRect
,是吗?如果是这样,您在绘图时可能没有有效的上下文,这可能会给您带来错误。
【参考方案1】:
听起来你是直接打电话给drawRect:
。因此,它会从您的电话中调用一次,然后从真正的绘图循环中调用一次。
drawRect:
中收到错误,并且实际绘图发生在真正的drawRect:
中,因此您可以看到您的图像。
不要直接拨打drawRect:
。致电setNeedsDisplay
和drawRect:
将在适当的时候为您呼叫。
【讨论】:
谢谢。我不是直接调用drawRect,但我会谈谈上下文。感谢您的反馈。 惭愧,我对自己的回答感到非常满意!很高兴你成功了。【参考方案2】:我发现了正在发生的事情。我的自定义 UIView 的 ViewController 主机正在实例化一个 CALayer 对象。这是一些旧代码,以前被用作我用来生成图像的 AVCaptureSession 中的位图的绘图层。
我现在不使用 CALayer,而只是将每一帧视频的一部分绘制到我视图中的默认图形上下文中。
由于某种原因,此 CALayer 的实例化导致了上下文中的冲突。
现在不用了,我只需要用下面的代码来画图……
- (void)drawRect:(CGRect)rect
UIImage *newImage = [UIImage imageNamed:@"character_1_0001.png"];
[newImage drawInRect:rect];
现在我只是对作为 CGImageRef 传入的图像做同样的事情并调整矩形......希望如此。
【讨论】:
以上是关于绘制 UIImage 时出现无效的上下文错误的主要内容,如果未能解决你的问题,请参考以下文章
<错误>:CGContextSaveGState:无效上下文 0x0 错误
尝试从数组中删除元素时出现此错误:上下文类型“Int”不能与数组文字一起使用