2012-04-09 11 views
1

Ich benutze CoreGraphics, um freie Handzeichnung zu implementieren, die für mich gut funktioniert, und jetzt möchte ich Rückgängig-Funktion für diese Zeichnung implementieren, damit Benutzer seinen letzten Strich löschen kann.Zeichnen mit CoreGraphics

Hier ist meine Zeichnungsmethode, die UITouchesBegin und UITouchesMoved funktioniert.

-(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(); 

    [self setNeedsDisplayInRect:drawBox]; 
} 

-(void)drawRect:(CGRect)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]; 
} 
+0

http://stackoverflow.com/questions/5741880/iphone-paint-application –

+0

Ich habe versucht, wie der Code in Frage, kann es aber nicht erfolgreich tun. [Here] (http://stackoverflow.com/questions/6689600/undo-drawing-in-paint-application) –

Antwort

2

Es können zwei Möglichkeiten, diese Sichtweisen auf meinen Standpunkt zu implementieren

  1. U Pfade in NSArray sparen können und alle, die in Schleife ziehen, während drawRect Methode aufrufen und dann während Verhängnis, entfernen letzte Objekt, fügen Sie es zum Puffer-Array hinzu und zeichnen Sie alle Arrays neu.

  2. Sie können einen Offline-Buffer-Canvas-Bereich abrufen, in dem Sie beim Zeichnen von Punkten ein Bild erstellen können, das Sie aktualisieren, wenn Sie es jedes Mal zeichnen. Hier müssen Sie auch ein Array von Punkten erstellen, aber nicht jedes Mal neu zeichnen. Wenn Sie rückgängig machen, entfernen Sie einfach das letzte Objekt und erstellen Sie einen neuen Pufferbereich, während Sie Punkte im Array zeichnen.

+0

Dank Dimple fällt mir die erste Option auf, aber wenn du es ein wenig für mich ausarbeiten kannst, wie ich es auch getan habe UITouchesMoved-Methode hinzugefügt. –

Verwandte Themen