I am using the following code to draw on an image with UITouch. This works fine and I save the image from a temporary imageView to another image view as I go. The problem is that I want to go back in and erase some of the drawing from the saved imageView. I know that I can set the color to white and it will appear to erase it but I am drawing on top of another imageView that contains an image from my camera roll. so I need to completely clear the saved drawing.
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
self.RealImage.frame = CGRectMake(14-(ax2*subtract),138-(ay2*subtract),740*see,850*see);
self.imageView.frame = CGRectMake(14-(ax2*subtract),138-(ay2*subtract),740*see,850*see);
self.tempImage.frame = CGRectMake(14-(ax2*subtract),138-(ay2*subtract),740*see,850*see);
ctr = 0;
UITouch *touch = [touches anyObject];
pts[0] = [touch locationInView:self.tempImage];
lastPoint = [touch locationInView:tempImage];
}
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
self.RealImage.frame = CGRectMake(14-(self.zoom),138-(self.first),740*see,850*see);
self.imageView.frame = CGRectMake(14-(self.zoom),138-(self.first),740*see,850*see);
self.tempImage.frame = CGRectMake(14-(self.zoom),138-(self.first),740*see,850*see);
UITouch *touch = [touches anyObject];
CGPoint p = [touch locationInView:self.tempImage];
currentPoint = [touch locationInView:tempImage];
ctr++;
pts[ctr] = p;
if (ctr == 4)
{
pts[3] = CGPointMake((pts[2].x + pts[4].x)/2.0, (pts[2].y + pts[4].y)/2.0); // move the endpoint to the middle of the line joining the second control point of the first Bezier segment and the first control point of the second Bezier segment
[path moveToPoint:pts[0]];
[path addCurveToPoint:pts[3] controlPoint1:pts[1] controlPoint2:pts[2]]; // add a cubic Bezier from pt[0] to pt[3], with control points pt[1] and pt[2]
[self draw2];
// replace points and get ready to handle the next segment
pts[0] = pts[3];
pts[1] = pts[4];
ctr = 1;
}
NSLog(@"ctr:%d",ctr);
lastPoint = currentPoint;
}
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
king = pencilString;
[path removeAllPoints];
ctr = 0;
UIGraphicsBeginImageContext(self.tempImage.frame.size);
self.RealImage.frame = CGRectMake(14-(self.zoom),138-(self.first),740*see,850*see);
self.imageView.frame = CGRectMake(14-(self.zoom),138-(self.first),740*see,850*see);
self.tempImage.frame = CGRectMake(14-(self.zoom),138-(self.first),740*see,850*see);
[self.imageView.image drawInRect:CGRectMake(0,0, self.imageView.frame.size.width, self.imageView.frame.size.height) blendMode:kCGBlendModeNormal alpha:1.0];
[self.tempImage.image drawInRect:CGRectMake(0,0, self.tempImage.frame.size.width, self.tempImage.frame.size.height) blendMode:kCGBlendModeNormal alpha:1.0];
self.imageView.image = UIGraphicsGetImageFromCurrentImageContext();
self.tempImage.image = nil;
if (see ==2) {
self.RealImage.frame = CGRectMake(14-(self.zoom),138-(self.first),1480,1700);
self.imageView.frame = CGRectMake(14-(self.zoom),138-(self.first),1480,1700);
self.tempImage.frame = CGRectMake(14-(self.zoom),138-(self.first),1480,1700);}
UIGraphicsEndImageContext();
}
- (void)draw2
{
self.RealImage.frame = CGRectMake(14-(self.zoom),138-(self.first),740*see,850*see);
self.imageView.frame = CGRectMake(14-(self.zoom),138-(self.first),740*see,850*see);
self.tempImage.frame = CGRectMake(14-(self.zoom),138-(self.first),740*see,850*see);
UIGraphicsBeginImageContext(self.tempImage.frame.size);
[self.tempImage.image drawInRect:CGRectMake(0, 0, self.tempImage.frame.size.width, self.tempImage.frame.size.height)];
pts[3] = CGPointMake((pts[2].x + pts[4].x)/2.0, (pts[2].y + pts[4].y)/2.0); // move the endpoint to the middle of the line joining the second control point of the first Bezier segment and the first control point of the second Bezier segment
[path moveToPoint:pts[0]];
[path addCurveToPoint:pts[3] controlPoint1:pts[1] controlPoint2:pts[2]]; // add a cubic Bezier from pt[0] to pt[3], with control points pt[1] and pt[2]
//here's where I try to create the erasure but all I get it a black line
if ([pencilString isEqualToString:@"clear2"]) {
mode = DrawingModePen;
if (mode == DrawingModePen) {
NSLog(@"drawing");
CGContextSetStrokeColorWithColor(UIGraphicsGetCurrentContext(), [[UIColor clearColor
] CGColor]);
}
UIGraphicsBeginImageContext(self.imageView.frame.size);
[self.imageView.image drawInRect:CGRectMake(0, 0, self.imageView.frame.size.width, self.imageView.frame.size.height)];
CGContextMoveToPoint(UIGraphicsGetCurrentContext(), lastPoint.x, lastPoint.y);
CGContextAddLineToPoint(UIGraphicsGetCurrentContext(), currentPoint.x, currentPoint.y);
self.imageView.image = UIGraphicsGetImageFromCurrentImageContext();
[self.imageView setAlpha:1.0];
[path stroke];
CGContextSetBlendMode(UIGraphicsGetCurrentContext(),kCGBlendModeCopy);
}
else if ([pencilString isEqualToString:@"red"]) {
[[UIColor colorWithRed:255.0/255.0 green:0.0 blue:0.0 alpha:1.0] setStroke];
}
else if ([pencilString isEqualToString:@"blue"]) {
[[UIColor colorWithRed:51.0/255.0 green:76.0/255.0 blue:255.0/255.0 alpha:1.0] setStroke];
}
else if ([pencilString isEqualToString:@"yellow"]) {
[[UIColor colorWithRed:255.0/255.0 green:255.0/255.0 blue:0.0 alpha:1.0] setStroke];
}
else if ([pencilString isEqualToString:@"orange"]) {
[[UIColor colorWithRed:255.0/255.0 green:90.0/255.0 blue:0.0 alpha:1.0] setStroke];
}
else if ([pencilString isEqualToString:@"green"]) {
[[UIColor colorWithRed:0.0 green:204.0/255.0 blue:0.0 alpha:1.0] setStroke];
}
else if ([pencilString isEqualToString:@"purple"]) {
[[UIColor colorWithRed:153.0/255.0 green:0.0 blue:255.0/255.0 alpha:1.0] setStroke];
}
else if ([pencilString isEqualToString:@"redOrange"]) {
[[UIColor colorWithRed:255.0/255.0 green:51.0/255.0 blue:0.0 alpha:1.0] setStroke];
}
else if ([pencilString isEqualToString:@"yellowOrange"]) {
[[UIColor colorWithRed:255.0/255.0 green:153.0/255.0 blue:0.0 alpha:1.0] setStroke];
}
else if ([pencilString isEqualToString:@"blueViolet"]) {
[[UIColor colorWithRed:102.0/255.0 green:51.0/255.0 blue:255.0/255.0 alpha:1.0] setStroke];
}
else if ([pencilString isEqualToString:@"blueGreen"]) {
[[UIColor colorWithRed:0.0 green:153.0/255.0 blue:204.0/255.0 alpha:1.0] setStroke];
}
else if ([pencilString isEqualToString:@"redViolet"]) {
[[UIColor colorWithRed:255.0/255.0 green:0.0 blue:153.0/255.0 alpha:1.0] setStroke];
}
else if ([pencilString isEqualToString:@"yellowGreen"]) {
[[UIColor colorWithRed:204.0/255.0 green:255.0/255.0 blue:0.0 alpha:1.0] setStroke];
}
else if ([pencilString isEqualToString:@"white"]) {
[[UIColor whiteColor] setStroke];
}
else if ([pencilString isEqualToString:@"ltGray"]) {
[[UIColor colorWithRed:204.0/255.0 green:204.0/255.0 blue:204.0/255.0 alpha:1.0] setStroke];
}
else if ([pencilString isEqualToString:@"dkGray"]) {
[[UIColor colorWithRed:102.0/255.0 green:102.0/255.0 blue:102.0/255.0 alpha:1.0] setStroke];
}
else if ([pencilString isEqualToString:@"brown"]) {
[[UIColor colorWithRed:102.0/255.0 green:51.0/255.0 blue:51.0/255.0 alpha:1.0] setStroke];
}
else if ([pencilString isEqualToString:@"tan"]) {
[[UIColor colorWithRed:255.0/255.0 green:204.0/255.0 blue:102.0/255.0 alpha:1.0] setStroke];
}
else if ([pencilString isEqualToString:@"black"]) {
[[UIColor blackColor] setStroke];
}
[path stroke];
CGContextSetBlendMode(UIGraphicsGetCurrentContext(),kCGBlendModeNormal);
// CGContextStrokePath(UIGraphicsGetCurrentContext());
self.tempImage.image = UIGraphicsGetImageFromCurrentImageContext();
[self.tempImage setAlpha:1.0];
self.RealImage.frame = CGRectMake(14-(self.zoom),138-(self.first),740*see,850*see);
self.imageView.frame = CGRectMake(14-(self.zoom),138-(self.first),740*see,850*see);
self.tempImage.frame = CGRectMake(14-(self.zoom),138-(self.first),740*see,850*see);
UIGraphicsEndImageContext();
}
I figured this out. I placed the if statement for the "clear2" erasure at the beginning of -(void) draw2{ rewriting it by making my drawing on the imageView and having the blendMode be kCGBlendModeCopy. Then I just put everything else inside the else statement and it works.
Here is the code.