尽管已经查看了超过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 {
....
}
不会弹出任何错误。我想知道如果我收到这些错误,因为touchesBegan
和touchesMoved
无法执行绘图?
在cocoa(OS X)中,我曾经使用setNeedsDisplay
,但它在cocoa touch中不存在。
我要问的是,无论如何都要删除这些错误,或者是否有另一种方法在运行时绘制UIBezierPath
。
答案 0 :(得分:16)
发生无效的上下文错误,因为您尝试在drawRect:
方法之外使用绘图操作,因此不会设置当前的图形上下文。
与OS X一样,您应该使用drawRect:
方法执行绘图,并使用setNeedsDisplay
更新生成的图像。 iOS上的UIView都可以使用setNeedsDisplay
和setNeedsDisplayInRect:
方法。
因此,结果应如下所示:
- (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];
}