2016-01-13 44 views
2

儘管查看了超過3個帖子(2015年製作)關於這個問題,但沒有解決我的問題。請設置CG_CONTEXT_SHOW_BACKTRACE環境變量

當過我跑,一個簡單的代碼來繪製使用UIBezierPath程序都將返回我這行:

:CGContextSetStrokeColorWithColor:無效的上下文爲0x0。如果您想要查看回溯,請設置CG_CONTEXT_SHOW_BACKTRACE 環境變量。

:CGContextSetFillColorWithColor:invalid context 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:invalid context 0x0。如果您想查看 backtrace,請設置CG_CONTEXT_SHOW_BACKTRACE環境變量 。

:CGContextDrawPath:invalid context 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無法執行繪圖?

在可可(OS X)中,我曾經使用setNeedsDisplay,但它在可可觸摸中不存在。

我所問的是,無論如何刪除這些錯誤,或者有另一種方式來在運行時繪製UIBezierPath

回答

10

無效的上下文錯誤發生,因爲您試圖使用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]; 
} 
+0

我也有類似的問題,並試圖調用的drawRect迫使一些圖形代碼加載時我看來繪製重繪。我試圖把我自己的價值放在drawRect參數中。使用setNeedsDisplay來解決我的問題。 – SpaceTrucker