1

したがって、質問のタイトルが最も説明的ではない可能性があることを知っているので、ここで実行します。

基本的に私が持っているのは、(レイヤーのコンテンツ プロパティを使用して) 画像を表示したもので、そのレイヤーの下に CAShapeLayer である Drawing レイヤーがあります。両方のレイヤーが存在する私のビューでは、CALayerDelegate もあり、今のところ、タップ ジェスチャに応答して特定の色で CGPaths を使用してポイントを描画します (タップ ジェスチャ セレクターは CAShapeLayer で setNeedsDisplay を呼び出します)。私が抱えている問題は、色を変更すると、ビューをタップすると、以前のすべてのポイントが自動的に新しく選択された色になることです...良くない...元の色を維持するには、各サブパス(つまりポイント)が必要です...多分いくつかのコードは、トピックにもう少し光を当てます:

デリゲート (注: drawingView.drawingPath は再利用されます):

- (void)drawLayer:(CAShapeLayer *)theLayer
    inContext:(CGContextRef)theContext {


if (CGPointEqualToPoint(drawingView.startPoint, drawingView.endPoint)) {


    CGPathMoveToPoint(drawingView.drawingPath, NULL, drawingView.startPoint.x, drawingView.startPoint.y);
    CGPathAddEllipseInRect(drawingView.drawingPath, NULL, CGRectMake(drawingView.startPoint.x, drawingView.startPoint.y, drawingView.drawRadius, drawingView.drawRadius));

    CGContextSetFillColorWithColor(theContext, drawingView.currentColor.CGColor);
    CGContextBeginPath(theContext);
    CGContextAddPath(theContext, drawingView.drawingPath);
    CGContextFillPath(theContext);

}

}

そして私のタップジェスチャレコグナイザー:

- (void)viewTapped:(UITapGestureRecognizer *)recognizer {

CGPoint touchPoint = [recognizer locationInView:recognizer.view];
startPoint = endPoint = touchPoint;
[drawingLayer setNeedsDisplay];

}

誰かがここで私が間違っていることを教えてくれたら、私は有頂天になるでしょう! :(

4

1 に答える 1

1

レイヤーを再描画するたびに、以前に保存した情報 (この場合は描画ビュー) を使用してすべてを描画します。この情報だけを使用して、画面上のすべてを表現できなければなりません。この場合、十分な情報を保存していないために問題が発生しています。必要なのは描画パスと色だけではなく、一連の描画パスと色です。これらの両方を含むオブジェクトのリストを drawingView に保持し、それらを繰り返し処理して、それぞれを描画する必要があります。現在の色を変更するたびに、どの色がパスのどの部分に属しているかを見失わないように、既に描画されているものを追跡し、古い色と一緒に保存する必要があります。

于 2011-09-20T16:55:18.277 に答える