web-dev-qa-db-ja.com

CG_CONTEXT_SHOW_BACKTRACE環境変数を設定してください

この問題について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が描画を実行できないためにこれらのエラーが発生したのでしょうか?

ココア(OS X)では、以前はsetNeedsDisplayを使用していましたが、ココアタッチには存在しません。

私が求めているのは、これらのエラーを取り除く方法があるのか​​、実行時にUIBezierPathを描画する別の方法があるのか​​、です。

10
31i45

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];
}
18
Borys Verebskyi