Mark Wallace
Mark Wallace

Reputation: 11

Clear CGContext Lines

Once I drawn some lines over an UIImage, (like a brush application), then I want to clear them, so like a rubber. I searched a lot on this site and on Google, and I tried some codes, but I couldn't find a correct solution. Here's the code I use to write:

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {

    if(isDrawing == YES) {

        UITouch *touch = [touches anyObject];
        CGPoint currentPoint = [touch locationInView:mainImageView.superview];

        UIGraphicsBeginImageContext(mainImageView.frame.size);
        [mainImageView.image drawInRect:CGRectMake(0, 0, mainImageView.frame.size.width, mainImageView.frame.size.height)];

        CGContextSetLineCap(UIGraphicsGetCurrentContext(), kCGLineCapRound);
        CGContextSetLineWidth(UIGraphicsGetCurrentContext(), dimension);

        const CGFloat *components = CGColorGetComponents([color CGColor]);
        CGContextSetRGBStrokeColor(UIGraphicsGetCurrentContext(), components[0], components[1], components[2], components[3]);

        CGContextBeginPath(UIGraphicsGetCurrentContext());
        CGContextMoveToPoint(UIGraphicsGetCurrentContext(), lastPoint.x, lastPoint.y);
        CGContextAddLineToPoint(UIGraphicsGetCurrentContext(), currentPoint.x, currentPoint.y);
        CGContextStrokePath(UIGraphicsGetCurrentContext());

        mainImageView.image = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();

        lastPoint = currentPoint;

    } else {
        //Clear current line (like a rubber would do)
    }
}

Upvotes: 1

Views: 1432

Answers (3)

Asif Mujteba
Asif Mujteba

Reputation: 4656

In this scenario [UIColor clearColor] won't work, use CGContextClearRect(context,rect); to clear the region!

Upvotes: 2

ingconti
ingconti

Reputation: 11646

The correct approach is using a Bezier path that:

  • records every drawings ( but actually does NOT draw.. in DrawRect we will draw.. using "stroke")
  • has thickness, color and so on...
  • draws effectively on view

Clearing it (using "removeAllPoints") and invoking setNeedsDisplay will make the background reappear.

If You want to rubber-clear the path you wrote using another tool, (say You use a pencil tool to write in blue.. and a Rubber tool to clear the blue lines and make background to reappear) you can use "containsPoint:" to remove some points form bezier path.

We did in such way.

using bezier path is NOT trivial but very exciting.. :)

Upvotes: 0

Gobra
Gobra

Reputation: 4261

Fill desired part of the context with the [UIColor clearColor].

Upvotes: 0

Related Questions