askingtoomuch
askingtoomuch

Reputation: 537

Clear a drawing in drawRect

How can I clear a drawing in a subview? What should I put in my (void)clearLine below?

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {

    // Setup subview to draw a line

    CGRect subviewRect = CGRectMake(0, 0, 250, 300);
    Draw* _draw = [[Draw alloc] initWithFrame:subviewRect];
    _draw.exclusiveTouch = NO;
    _draw.backgroundColor = [UIColor clearColor];
    [self addSubview:_draw];
    }
    return self;
}

- (void) clearLine
    {
    // how can I clear the drawing in Draw
    }

And below is the Draw.m file, that will draw a straight line by getting the first touch as the starting point and the second touch as the ending point.

@implementation Draw

- (void)drawRect:(CGRect)rect {

    CGPoint fromPoint;
    CGPoint toPoint;

    CGContextRef context = UIGraphicsGetCurrentContext();

    CGContextSetLineWidth(context, 2.0);
    CGColorSpaceRef colorspace = CGColorSpaceCreateDeviceRGB();
    CGFloat components[] = {0.0, 0.0, 1.0, 1.0};
    CGColorRef color = CGColorCreate(colorspace, components);
    CGContextSetStrokeColorWithColor(context, color);
    CGContextSetLineCap(context, kCGLineCapRound);

    CGContextMoveToPoint(context, fromPoint.x, fromPoint.y);
    CGContextAddLineToPoint(context, toPoint.x, toPoint.y);
    CGContextStrokePath(context);
    CGColorSpaceRelease(colorspace);
    CGColorRelease(color);
}    

// Touch event
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    UITouch* touchPoint = [touches anyObject];
    fromPoint = [touchPoint locationInView:self];
    toPoint = [touchPoint locationInView:self];
}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
    UITouch* touch = [touches anyObject];
    toPoint = [touch locationInView:self];    
    [self setNeedsDisplay];
}

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    UITouch* touch = [touches anyObject];
    toPoint = [touch locationInView:self];    
    [self setNeedsDisplay];
}

Upvotes: 0

Views: 2428

Answers (3)

SachinVsSachin
SachinVsSachin

Reputation: 6427

Make a Bool variable in Draw class

And when you want to clear all like this

- (void) clearLine
{
// Here you can clearn lines 
 [_draw CleanAllLines]
}

And In Draw class make the method

-(void)CleanAllLines{
isNeedToClear = YES;
[self setNeedsLayout];
}

- (void)drawRect:(CGRect)rect {
if(isNeedToClear){
isNeedToClear = NO;
return;
}

CGPoint fromPoint;
CGPoint toPoint;

CGContextRef context = UIGraphicsGetCurrentContext();

CGContextSetLineWidth(context, 2.0);
CGColorSpaceRef colorspace = CGColorSpaceCreateDeviceRGB();
CGFloat components[] = {0.0, 0.0, 1.0, 1.0};
CGColorRef color = CGColorCreate(colorspace, components);
CGContextSetStrokeColorWithColor(context, color);
CGContextSetLineCap(context, kCGLineCapRound);

CGContextMoveToPoint(context, fromPoint.x, fromPoint.y);
CGContextAddLineToPoint(context, toPoint.x, toPoint.y);
CGContextStrokePath(context);
CGColorSpaceRelease(colorspace);
CGColorRelease(color);

}

Upvotes: 1

Rajneesh071
Rajneesh071

Reputation: 31091

Draw the background color on your view,

Like if you have white background then [UIColor whiteColor];
if you have black background then [UIColor blackColor];

Upvotes: 1

BhushanVU
BhushanVU

Reputation: 3455

In clear line you should remove Draw view and set it nil

Draw* _draw;

- (void) clearLine
{
  [_draw removeFromSuperview];
  _draw=nil;

}

and to again enable drawing use

-(void) initDrawView
{
    CGRect subviewRect = CGRectMake(0, 0, 250, 300);
    if(_draw!=nil)
    {
     [_draw removeFromSuperview];
     _draw=nil;
     }
     _draw = [[Draw alloc] initWithFrame:subviewRect];
    _draw.exclusiveTouch = NO;
    _draw.backgroundColor = [UIColor clearColor];
    [self addSubview:_draw];

}

Upvotes: 3

Related Questions