1

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];
}
4

1 に答える 1

2

私の観点からこれを実装するには2つの方法があります

  1. UはNSArrayにパスを保存し、メソッドの呼び出し中にすべてのパスをループで描画しdrawRect、元に戻すときに最後のオブジェクトを削除してバッファ配列に追加し、すべての配列を再描画できます。

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

于 2012-04-09T11:34:01.500 に答える