5

ここに新しいプログラマー。Core Graphicsを使用して、タッチ位置の周りにストロークアークを描画しようとすると問題が発生します。円を描くメソッドがあり、画面をタップしたときにタッチをテストして登録していますが、タップしたときに円を描くメソッドを呼び出そうとすると、「CGContextBlahBlah:無効なコンテキスト」というエラーが表示されます。 0x0 "

これは、drawRect :()でメソッドを呼び出していないためだと思います。

では、このメソッドをタッチで呼び出すにはどうすればよいですか?さらに、drawメソッドのパラメーターとして「CGPointlocationOfTouch」を使用するにはどうすればよいですか?

これが私が扱っているコードチャンクです。

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch *touch = [touches anyObject];
    CGPoint locationOfTouch = [touch locationInView:self];
    [self drawTouchCircle:(locationOfTouch)];
    [self setNeedsDisplay];
}


-(void)drawTouchCircle:(CGPoint)locationOfTouch
{
    CGContextRef ctx= UIGraphicsGetCurrentContext();

    CGContextSaveGState(ctx);

    CGContextSetLineWidth(ctx,5);
    CGContextSetRGBStrokeColor(ctx,0.8,0.8,0.8,1.0);
    CGContextAddArc(ctx,locationOfTouch.x,locationOfTouch.y,30,0.0,M_PI*2,YES);
    CGContextStrokePath(ctx);
}

助けてくれてありがとう!

4

1 に答える 1

7

はい、あなたが正しい。問題は、自分自身を呼び出すのではなく、それを呼び出すメソッドをdrawTouchCircle実装する必要があるdrawRectことです。したがって、touchesメソッドは を呼び出すだけsetNeedsDisplaydrawRectよく、残りは処理されます。したがって、タッチ位置をクラス プロパティに保存してから、次のように取得することをお勧めしますdrawRect

@interface View ()
@property (nonatomic) BOOL touched;
@property (nonatomic) CGPoint locationOfTouch;
@end

@implementation View

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    [super touchesBegan:touches withEvent:event];

    self.touched = YES;
    UITouch *touch = [touches anyObject];
    self.locationOfTouch = [touch locationInView:self];
    [self setNeedsDisplay];
}

- (void)drawTouchCircle:(CGPoint)locationOfTouch
{
    CGContextRef ctx= UIGraphicsGetCurrentContext();
    CGRect bounds = [self bounds];

    CGPoint center;
    center.x = bounds.origin.x + bounds.size.width / 2.0;
    center.y = bounds.origin.y + bounds.size.height / 2.0;
    CGContextSaveGState(ctx);

    CGContextSetLineWidth(ctx,5);
    CGContextSetRGBStrokeColor(ctx,0.8,0.8,0.8,1.0);
    CGContextAddArc(ctx,locationOfTouch.x,locationOfTouch.y,30,0.0,M_PI*2,YES);
    CGContextStrokePath(ctx);
}

- (void)drawRect:(CGRect)rect
{
    if (self.touched)
        [self drawTouchCircle:self.locationOfTouch];
}

@end
于 2013-02-16T00:48:56.773 に答える