如何在iOS中通过QuartzCore绘制连续线条

时间:2011-06-29 04:05:28

标签: iphone quartz-graphics

我对iOS上的石英核心有疑问

当我使用Quartz绘制线条时,会发生以下情况,我找不到原因:


当我画第二行时,第一行会消失

当我绘制第三行时,第二行会消失,第一行和第三行会显示 ..

当我绘制第2n + 1行时,1,3,5,...... 2n-1行显示,而2,4,6,8 ... 2n消失


请参阅下面的代码。我不保存上下文和路径 作为我的理解,我认为它应该是两个案例中的一个

  1. 显示我绘制的所有行
  2. 显示我绘制的最后一行,前一行应该消失
  3. 但这两种情况都没有发生。

    - (void)drawInContext:(CGContextRef)context {
    
        //  橡皮擦
        //CGContextClearRect(context, CGRectMake(0, 0, 320, 480));
    
        CGContextSetLineWidth(context, 4.0);
        CGContextMoveToPoint(context, previousPoint.x, previousPoint.y);
        CGContextSetRGBStrokeColor(context, 0, 1.0, 1.0, 1.0);  
        CGContextAddLineToPoint(context, nextPoint.x,nextPoint.y);
        CGContextStrokePath(context);
        //NIF_TRACE(@"began : %@ moved : %@", NSStringFromCGPoint(previousPoint),NSStringFromCGPoint(nextPoint));
    
    }
    
    - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
        UITouch *touch = [touches anyObject];
    
        previousPoint = [touch locationInView:self];
        nextPoint = [touch locationInView:self];
    
    }
    
    - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
        UITouch *touch = [touches anyObject];
    
        previousPoint = nextPoint;
        nextPoint = [touch locationInView:self];        
        [self setNeedsDisplay];
    
    }
    

    我看到一个使用NSMutableArray来保存它绘制的所有UIBezierPaths的演示,当View重绘时,它传输保存在数组中的路径,在drawRect中恢复它们:

    UIBezierPath是Objective C的包装器,它只适用于3.2+ 我需要做一些让它在3.0+以上工作的东西 我认为它必须存在一种更好的方法来保存上下文和路径(颜色,路径,strokeWidths)

    有人有想法吗?

2 个答案:

答案 0 :(得分:1)

每当你“drawInContext”时,你正在清理绘图区域并放置新的行....这个清晰的代码:

CGContextClearRect(context, CGRectMake(0, 0, 320, 480));

需要在你的代码中的某个地方......只会被激活一次(或者如果你需要清除整个绘图(可能是擦除所有功能))

答案 1 :(得分:0)

您需要将图像保存在画布上:

CGImageRef  imageRef;

- (void)drawRect:(CGRect)rect {

    CGContextRef context = UIGraphicsGetCurrentContext();

    if (imageRef) {
        // Restore the screen that was previously saved
        CGContextTranslateCTM(context, 0, rect.size.height);
        CGContextScaleCTM(context, 1.0, -1.0);

        CGContextDrawImage(context, rect, imageRef);
        CGImageRelease(imageRef);

        CGContextTranslateCTM(context, 0, rect.size.height);
        CGContextScaleCTM(context, 1.0, -1.0);
    }

    // Your drawing code here...

    imageRef = CGBitmapContextCreateImage(context);
}