请设置CG_CONTEXT_SHOW_BACKTRACE环境变量

时间:2016-01-13 10:39:42

标签: objective-c cocoa-touch uibezierpath

尽管已经查看了超过3篇关于这个问题的帖子(2015年制作),但是还没有解决我的问题。

当我运行时,一个简单的代码使用UIBezierPath绘制一条线程序会将这个返回给我:

  

:CGContextSetStrokeColorWithColor:无效的上下文0x0。如果你   想查看回溯,请设置CG_CONTEXT_SHOW_BACKTRACE   环境变量。

     

:CGContextSetFillColorWithColor:无效的上下文0x0。如果你   想查看回溯,请设置CG_CONTEXT_SHOW_BACKTRACE   环境变量。

     

:CGContextSaveGState:无效的上下文0x0。如果你想看到   回溯,请设置CG_CONTEXT_SHOW_BACKTRACE环境   变量

     

:CGContextSetLineWidth:无效的上下文0x0。如果你想   看到回溯,请设置CG_CONTEXT_SHOW_BACKTRACE环境   变量

     

:CGContextSetLineJoin:无效的上下文0x0。如果你想看到   回溯,请设置CG_CONTEXT_SHOW_BACKTRACE环境   变量

     

:CGContextSetLineCap:无效的上下文0x0。如果你想看到   回溯,请设置CG_CONTEXT_SHOW_BACKTRACE环境   变量

     

:CGContextSetMiterLimit:无效的上下文0x0。如果你想   看到回溯,请设置CG_CONTEXT_SHOW_BACKTRACE环境   变量

     

:CGContextSetFlatness:无效的上下文0x0。如果你想看到   回溯,请设置CG_CONTEXT_SHOW_BACKTRACE环境   变量

     

:CGContextAddPath:无效的上下文0x0。如果你想看到   回溯,请设置CG_CONTEXT_SHOW_BACKTRACE环境   变量

     

:CGContextDrawPath:无效的上下文0x0。如果你想看到   回溯,请设置CG_CONTEXT_SHOW_BACKTRACE环境   变量

     

:CGContextRestoreGState:无效的上下文0x0。如果你想   看到回溯,请设置CG_CONTEXT_SHOW_BACKTRACE环境   变量

@interface line : UIView
UIBezierPath *myPath;
.........
@implementation
- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
UITouch *touch = [[event allTouches]anyObject];
CGPoint touchLocation = [touch locationInView:self];
myPath = [UIBezierPath bezierPath];
[myPath moveToPoint:touchLocation];
}
- (void) touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
UITouch *touch = [[event allTouches]anyObject];
CGPoint touchLocation = [touch locationInView:self];
[myPath addLineToPoint:touchLocation];
[[UIColor blackColor]setStroke];
[[UIColor greenColor]setFill];
[myPath stroke];
}

如果我要使用drawRect绘制

- (void) drawRect:(CGRect)rect {
....
}

不会弹出任何错误。我想知道如果我收到这些错误,因为touchesBegantouchesMoved无法执行绘图?

在cocoa(OS X)中,我曾经使用setNeedsDisplay,但它在cocoa touch中不存在。

我要问的是,无论如何都要删除这些错误,或者是否有另一种方法在运行时绘制UIBezierPath

1 个答案:

答案 0 :(得分:16)

发生无效的上下文错误,因为您尝试在drawRect:方法之外使用绘图操作,因此不会设置当前的图形上下文。

与OS X一样,您应该使用drawRect:方法执行绘图,并使用setNeedsDisplay更新生成的图像。 iOS上的UIView都可以使用setNeedsDisplaysetNeedsDisplayInRect:方法。

因此,结果应如下所示:

- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
UITouch *touch = [[event allTouches]anyObject];
CGPoint touchLocation = [touch locationInView:self];
myPath = [UIBezierPath bezierPath];
[myPath moveToPoint:touchLocation];
}

- (void) touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
UITouch *touch = [[event allTouches]anyObject];
CGPoint touchLocation = [touch locationInView:self];
[myPath addLineToPoint:touchLocation];
[self setNeedsDisplay];
}

- (void) drawRect:(CGRect)rect {
[[UIColor blackColor]setStroke];
[[UIColor greenColor]setFill];
[myPath stroke];
}