1

ビュー内のタッチを追跡し、関連する「キャンバス」レイヤーに対応する線を作成しています。ポイントはCGPathRefに蓄積され、touchesDidEnd時にNSArrayに保存されます。

drawLayer時に、現在のパスと保存されているパスの両方を次のように描画します。

  // draw the current line:
    CGContextAddPath(ctx, path);
    CGContextStrokePath(ctx);
    NSLog(@"Canvas drawing path %@", path);

    // draw the stored lines
    for (NSMutableArray *arr in storedPaths) {
        CGMutablePathRef aPath = CGPathCreateMutable();
        // set up the path with the CGPointObjects
        NSLog(@"Canvas drawing stored path");
        BOOL inited = NO;
        for (CGPointObject *thePt in arr) {                    
            if (inited==NO) {
                CGPathMoveToPoint(aPath, NULL, [thePt.x floatValue],  [thePt.y floatValue]);
                //CGContextMoveToPoint(ctx, [thePt.x floatValue], [thePt.y floatValue]);
                inited = YES;
            }
            else {
                CGPathAddLineToPoint(aPath, NULL, [thePt.x floatValue], [thePt.y floatValue]); 
                //CGContextAddLineToPoint(ctx, [thePt.x floatValue], [thePt.y floatValue]); 
            }
        }
        CGContextAddPath(ctx, aPath);
        CGContextStrokePath(ctx);
        // didn't help connected problem
        //CGPathRelease(aPath);
    }

これは、最初の行の終点を次の行の始点に接続することを除いて、期待どおりに機能します。例:ユーザーはXを描画しますが、2つのエンドポイントが接続された状態でXを取得します。

CGClosePathは私が望むもののようには見えません。任意の提案をいただければ幸いです。

4

2 に答える 2

0

CGContextAddPath()に関するAppleのドキュメントは驚くほど不十分ですが、新しいサブパスを追加するのではなく、前のパスを継続しているように見えます。したがって、単一のCGMutablePathRefを作成し、それをサブパスで埋めてから、すべてをコンテキストに追加してストロークしてみてください。

つまり、CGPathCreateMutable()の呼び出しを外側のループの前に移動し、CGContextAddPath()とCGContextStrokePath()の呼び出しをその後ろに移動します。残りは同じままでかまいません。

于 2012-05-17T01:56:48.210 に答える
0

すべての偶数/奇数のペアが線である場合は、「inited==NO」をカウンターに置き換え、「counter%2 == 0」を使用して、偶数のポイントの場合は目的の場所に移動し、奇数のポイントの場合は移動します前のポイントを接続します。高速列挙ではなく、代わりに昔ながらの for ループを使用する方が簡単な場合があります。

    for (int i = 0; i < [arr count]; ++i) {
        CGPointObject *thePt = [arr objectAtIndex:i];                    
        if (i%2 == 0)
            CGPathMoveToPoint(aPath, NULL, [thePt.x floatValue],  [thePt.y floatValue]);
        else
            CGPathAddLineToPoint(aPath, NULL, [thePt.x floatValue], [thePt.y floatValue]); 
    }
于 2012-05-16T18:46:35.033 に答える