【问题标题】:please set CG_CONTEXT_SHOW_BACKTRACE environmental variable请设置 CG_CONTEXT_SHOW_BACKTRACE 环境变量
【发布时间】:2016-01-13 10:39:41
【问题描述】:

尽管查看了超过 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

【问题讨论】:

    标签: objective-c cocoa-touch uibezierpath


    【解决方案1】:

    出现无效上下文错误,因为您试图在drawRect: 方法之外使用绘图操作,因此没有设置当前图形上下文。

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

    所以,结果应该是这样的:

    - (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];
    }
    

    【讨论】:

    • 我遇到了类似的问题,并试图调用 drawRect 来强制重绘我的视图在加载时绘制的一些图形代码。我试图将自己的值放在 drawRect 参数中。改用 setNeedsDisplay 解决了我的问题。
    猜你喜欢
    • 2015-10-30
    • 1970-01-01
    • 1970-01-01
    • 2018-07-13
    • 2014-12-17
    • 1970-01-01
    • 2014-09-24
    • 1970-01-01
    • 2016-02-03
    相关资源
    最近更新 更多