Reputation: 2855
I am trying to clear graphics context. It clears perfectly using these 2 ways.
1. clearContextBeforeDrawing
2. CGContextClearRect(context, rect);
CGContextSetFillColorWithColor(context, [UIColor whiteColor].CGColor);
CGContextFillRect(context, rect);
CGContextFlush(context);
But when I draw lines again. The previous lines are mixed up with the new lines with dots appearing. Can anyone please help ?
This is how I am clearing lines
-(IBAction)eraseButton:(id)sender
{
self.viewmainHandwriting.isErase = TRUE;
[self.viewmainHandwriting setBackgroundColor:[UIColor clearColor]];
[self.viewmainHandwriting setNeedsDisplay]; //It calls my drawRect Function
}
- (void)drawRect:(CGRect)rect
{
CGContextRef context = UIGraphicsGetCurrentContext();
if (!self.isErase)
{
CGContextAddPath(context, path);
CGContextSetLineCap(context, kCGLineCapRound);
CGContextSetLineWidth(context, self.lineWidth);
CGContextSetStrokeColorWithColor(context, self.lineColor.CGColor);
CGContextStrokePath(context);
self.empty = NO;
}
else
{
CGContextClearRect(context, self.bounds);
path
self.isErase = FALSE;
}
}
The is how I am drawing lines
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
UITouch *touch = [touches anyObject];
previousPoint1 = [touch previousLocationInView:self];
previousPoint2 = [touch previousLocationInView:self];
currentPoint = [touch locationInView:self];
[self touchesMoved:touches withEvent:event];
}
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
UITouch *touch = [touches anyObject];
CGPoint point = [touch locationInView:self];
/* check if the point is farther than min dist from previous */
CGFloat dx = point.x - currentPoint.x;
CGFloat dy = point.y - currentPoint.y;
if ((dx * dx + dy * dy) < kPointMinDistanceSquared) {
return;
}
previousPoint2 = previousPoint1;
previousPoint1 = [touch previousLocationInView:self];
currentPoint = [touch locationInView:self];
CGPoint mid1 = midPoint(previousPoint1, previousPoint2);
CGPoint mid2 = midPoint(currentPoint, previousPoint1);
CGMutablePathRef subpath = CGPathCreateMutable();
CGPathMoveToPoint(subpath, NULL, mid1.x, mid1.y);
CGPathAddQuadCurveToPoint(subpath, NULL, previousPoint1.x, previousPoint1.y, mid2.x, mid2.y);
CGRect bounds = CGPathGetBoundingBox(subpath);
CGPathAddPath(path, NULL, subpath);
CGPathRelease(subpath);
CGRect drawBox = bounds;
drawBox.origin.x -= self.lineWidth * 2.0;
drawBox.origin.y -= self.lineWidth * 2.0;
drawBox.size.width += self.lineWidth * 4.0;
drawBox.size.height += self.lineWidth * 4.0;
[self setNeedsDisplayInRect:drawBox];
}
Upvotes: 0
Views: 2374
Reputation: 81868
It looks like you don't clear path
in the method that clears the whole view (eraseButton
?).
So the path would still contain the whole old drawing. Only those parts would show on which you call setNeedsDisplayInRect:
(from within touchesMoved:
). You can reveal the old drawing by drawing over it again.
You should clear path
(probably an ivar) by just creating a new one in eraseButton:
CGPathRelease(path);
path = CGPathCreateMutable();
Upvotes: 1