Using Core Graphics to Draw

I am creating an iOS drawing application for the first time. Now I can draw lines and curves using the main graphics, but unable to draw UNDO. I save all the moments when drawing and try to reuse them for UNDO and REDO, but without success. Can someone help to know what I'm doing wrong?

Any help is appreciated.

Here is my code

   -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    [tempPathArray removeAllObjects];
    UITouch *touch = [touches anyObject];

    previousPoint1 = [touch previousLocationInView:self];
    previousPoint2 = [touch previousLocationInView:self];
    currentPoint = [touch locationInView:self];

}

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

    UITouch *touch  = [touches anyObject];

    previousPoint2  = previousPoint1;
    previousPoint1  = [touch previousLocationInView:self];
    currentPoint    = [touch locationInView:self];


    // calculate mid point
    CGPoint mid1    = midPoint(previousPoint1, previousPoint2); 
    CGPoint mid2    = midPoint(currentPoint, previousPoint1);

    CGMutablePathRef path = CGPathCreateMutable();
    CGPathMoveToPoint(path, NULL, mid1.x, mid1.y);
    CGPathAddQuadCurveToPoint(path, NULL, previousPoint1.x, previousPoint1.y, mid2.x, mid2.y);
    CGRect bounds = CGPathGetBoundingBox(path);
    CGPathRelease(path);

    drawBox = bounds;

    //Pad our values so the bounding box respects our line width
    drawBox.origin.x        -= self.lineWidth * 2;
    drawBox.origin.y        -= self.lineWidth * 2;
    drawBox.size.width      += self.lineWidth * 4;
    drawBox.size.height     += self.lineWidth * 4;

    UIGraphicsBeginImageContext(drawBox.size);
    [self.layer renderInContext:UIGraphicsGetCurrentContext()];
    curImage = UIGraphicsGetImageFromCurrentImageContext();
    [curImage retain];
    UIGraphicsEndImageContext();

    [tempPathArray addObject:[NSValue valueWithCGRect:drawBox]];


    [self setNeedsDisplayInRect:drawBox];

}

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

    [pathArray addObject:tempPathArray];
    NSLog(@"path array count %d", [pathArray count]);
}

    - (void)drawRect:(CGRect)rect
{
    NSLog(@"draw rect");
    [curImage drawAtPoint:CGPointMake(0, 0)];
    CGPoint mid1 = midPoint(previousPoint1, previousPoint2); 
    CGPoint mid2 = midPoint(currentPoint, previousPoint1);

    context = UIGraphicsGetCurrentContext(); 

    [self.layer renderInContext:context];

    CGContextMoveToPoint(context, mid1.x, mid1.y);
    // Use QuadCurve is the key
    CGContextAddQuadCurveToPoint(context, previousPoint1.x, previousPoint1.y, mid2.x, mid2.y); 

    CGContextSetLineCap(context, kCGLineCapRound);
    CGContextSetLineWidth(context, self.lineWidth);
    CGContextSetStrokeColorWithColor(context, self.lineColor.CGColor);

    CGContextStrokePath(context);
    [super drawRect:rect];

}

    -(void)undoButtonClicked
{

    KidsPhotoBookAppDelegate *appDelegate = (KidsPhotoBookAppDelegate*)[[UIApplication sharedApplication]delegate];


    if([pathArray count]>0){
        [bufferArray addObject:[pathArray lastObject]];
        [pathArray removeLastObject];

        for (NSMutableArray *tempArray in pathArray) {
            for (int i  = 0; i < [tempArray count]; i++) {
                CGRect draw = [[tempArray objectAtIndex:i] CGRectValue];
                [self setNeedsDisplayInRect:draw];
            }
        }
    }


}
+3
source share
1 answer

Try the following:

  • Draw a line.
  • Draw another line in the first line.
  • Undo.

I suspect that you will see that it works mainly - the part of the second line that overlaps the first line will disappear, and only the part that has not been saved will remain.

, , , , . , : , , , , , , , .

, , , . - .

0

All Articles