2012-04-09 11 views
1

私はCoreGraphicsを使用してフリーハンド描画を実装しています。これは私にとってはうまく機能していますが、今度はユーザーが最後のストロークをクリアできるようにこの描画のUndo機能を実装したいと思います。Drawing with CoreGraphics

ここでは、UITouchesBeginとUITouchesMovedを使用している私の描画メソッドです。

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

私は、問題のコードのように試みたが成功し、それを行うことができませんでした。 [Here](http://stackoverflow.com/questions/6689600/undo-drawing-in-paint-application) –

答えて

2

私の視点でこれを実装するには2つの方法があることができ

  1. drawRectメソッドを呼び出した後、元に戻すながら、最後に削除しながら、UはNSArrayの内のパスを保存し、ループ内のすべてのそれらを描くことができます

    オブジェクトをバッファ配列に追加し、すべての配列を再描画します。

  2. Uは、ポイントを描画している間に作成されたイメージを持つことができるオフラインバッファキャンバスを1つ取得できます。毎回描画するときにそれを更新します。ここでポイントの配列を作成する必要がありますが、毎回再描画はしません。元に戻すときは、最後のオブジェクトを削除し、ポイントを配列で描画しながら新しいバッファキャンバスを作成するだけです。

+0

ディンプルありがとうございます最初のオプションは私の心を打つことですが、私はまた、 UITouchesMovedメソッドが追加されました。 –