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,但获得了两个端点相连的 X。

CGClosePath 看起来不像我想要的。任何建议将不胜感激。

4

2 回答 2

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 回答
0

苹果关于 CGContextAddPath() 的文档非常不足,但看起来它正在继续以前的路径,而不是添加新的子路径。所以,尝试构建一个单一的 CGMutablePathRef,用子路径填充它,然后将整个东西添加到上下文中并抚摸它。

即,将对 CGPathCreateMutable() 的调用移至外循环之前,并将对 CGContextAddPath() 和 CGContextStrokePath() 的调用移至其之后。其余的可以保持不变。

于 2012-05-17T01:56:48.210 回答