5

新程序员来了。我在尝试使用 Core Graphics 在我的触摸位置周围绘制描边弧时遇到问题。我有绘制圆圈的方法工作正常,并且我已经测试并在点击屏幕时注册了触摸,但是当我尝试在点击时调用绘制圆圈的方法时,我收到错误“CG​​ContextBlahBlah:无效上下文0x0"

认为这是因为我没有在 drawRect:() 中调用该方法。

那么我怎样才能通过触摸调用这个方法呢?此外,如何在我的绘图方法中使用“CGPoint locationOfTouch”作为参数?

这是我正在使用的代码块。

-(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 回答