Undo a button in a paint application using UIKit

I wam trying to implement the cancel button, everything works fine, and I can cache the action, but somehow the previously drawn lines are still there, they should disappear with every unoclick action. Please, help

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { path = [[UIBezierPath alloc] init]; mouseSwiped = NO; UITouch *touch = [touches anyObject]; lastPoint = [touch locationInView:self.view]; CGPoint p = [touch locationInView:self.view]; [path moveToPoint:p]; [pathArray addObject:path]; // NSLog(@"%@",pathArray); } - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { mouseSwiped = YES; UITouch *touch = [touches anyObject]; CGPoint currentPoint = [touch locationInView:self.view]; CGPoint p = [touch locationInView:self.view]; [path addLineToPoint:p]; UIGraphicsBeginImageContext(self.view.frame.size); [self.tempDrawImage.image drawInRect:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)]; CGContextMoveToPoint(UIGraphicsGetCurrentContext(), lastPoint.x, lastPoint.y); CGContextAddLineToPoint(UIGraphicsGetCurrentContext(), currentPoint.x, currentPoint.y); CGContextSetLineCap(UIGraphicsGetCurrentContext(), kCGLineCapRound); CGContextSetLineWidth(UIGraphicsGetCurrentContext(), brush ); CGContextSetRGBStrokeColor(UIGraphicsGetCurrentContext(), red, green, blue, 1.0); CGContextSetBlendMode(UIGraphicsGetCurrentContext(),kCGBlendModeNormal); CGContextStrokePath(UIGraphicsGetCurrentContext()); self.tempDrawImage.image = UIGraphicsGetImageFromCurrentImageContext(); [self.tempDrawImage setAlpha:opacity]; UIGraphicsEndImageContext(); lastPoint = currentPoint; [self.view setNeedsDisplay]; } - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { UITouch *touch = [touches anyObject]; CGPoint p = [touch locationInView:self.view]; [path addLineToPoint:p]; if(!mouseSwiped) { UIGraphicsBeginImageContext(self.view.frame.size); [self.tempDrawImage.image drawInRect:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)]; CGContextSetLineCap(UIGraphicsGetCurrentContext(), kCGLineCapRound); CGContextSetLineWidth(UIGraphicsGetCurrentContext(), brush); CGContextSetRGBStrokeColor(UIGraphicsGetCurrentContext(), red, green, blue, opacity); CGContextMoveToPoint(UIGraphicsGetCurrentContext(), lastPoint.x, lastPoint.y); CGContextAddLineToPoint(UIGraphicsGetCurrentContext(), lastPoint.x, lastPoint.y); CGContextStrokePath(UIGraphicsGetCurrentContext()); CGContextFlush(UIGraphicsGetCurrentContext()); self.tempDrawImage.image = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); } UIGraphicsBeginImageContext(self.mainImage.frame.size); [self.mainImage.image drawInRect:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height) blendMode:kCGBlendModeNormal alpha:1.0]; [self.tempDrawImage.image drawInRect:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height) blendMode:kCGBlendModeNormal alpha:opacity]; self.mainImage.image = UIGraphicsGetImageFromCurrentImageContext(); self.tempDrawImage.image = nil; UIGraphicsEndImageContext(); [self mainImage]; [self.view setNeedsDisplay]; [path removeAllPoints]; } 

with the following undo function, and the patharray counter decreases with every click, but the drawing lines still exist

 -(IBAction)undoButtonClicked:(id)sender { NSLog(@"%s", __FUNCTION__); NSLog(@"pathArray count is %i", [pathArray count]); if([pathArray count]>0){ UIBezierPath *_path=[pathArray lastObject]; [bufferArray addObject:_path]; [pathArray removeLastObject]; //self.tempDrawImage.image; [self.view setNeedsDisplay]; } } 
+4
source share
1 answer

It looks like you are using tempImage ivar to accumulate the strokes of the drawing, but when you click cancel, you do nothing to erase the lines that were already drawn there. I do not know how complex your drawing requirements are. If they are simple, you can simply pathArray over the pathArray into the -drawRect view that calls -stroke on each path (you will need to set the line lineWidth, etc. On the path or in the view every time you draw a stroke, of course). As a simple optimization, you can calculate the borders of the new / deleted strokes, and then call setNeedsDisplayInRect: in the corresponding part of the view. Since you update tempImage every time the touch move moves, which I think has pretty high overhead.

0
source

All Articles