如何在cgcontext中轻轻擦除绘制的路径?

时间:2017-03-12 08:15:49

标签: ios objective-c alpha cgcontext erase

我设法在CGContext上实现擦除图纸

 UIImageView *maskImgView = [self.view viewWithTag:K_MASKIMG];
    UIGraphicsBeginImageContext(maskImgView.image.size);
    [maskImgView.image drawAtPoint:CGPointMake(0,0)];
    float alp = 0.5;

    UIImage *oriBrush = [UIImage imageNamed:_brushName];

    //sets the style for the endpoints of lines drawn in a graphics context
    CGContextRef ctx = UIGraphicsGetCurrentContext();

    CGFloat eraseSize = oriBrush.size.width*_brushSize/_zoomCurrentFactor;

    CGContextSetLineCap(ctx, kCGLineCapRound);
    CGContextSetLineJoin(ctx, kCGLineJoinRound);
    CGContextSetLineWidth(ctx,eraseSize);
    CGContextSetRGBStrokeColor(ctx, 1, 1, 1, alp);
    CGContextSetBlendMode(ctx, kCGBlendModeClear);


    CGContextBeginPath(ctx);
    CGContextMoveToPoint(ctx, lastPoint.x,lastPoint.y);

    CGPoint vector = CGPointMake(currentPoint.x - lastPoint.x, currentPoint.y - lastPoint.y);
    CGFloat distance = hypotf(vector.x, vector.y);
    vector.x /= distance;
    vector.y /= distance;

    for (CGFloat i = 0; i < distance; i += 1.0f) {
        CGPoint p = CGPointMake(lastPoint.x + i * vector.x, lastPoint.y + i * vector.y);
        CGContextAddLineToPoint(ctx, p.x, p.y);
    }

    CGContextStrokePath(ctx);

    maskImgView.image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    lastPoint = currentPoint;

问题是,这完全抹去了任何东西。这个函数中的alpha集(CGContextSetRGBStrokeColor(ctx, 1, 1, 1, alp);)似乎完全被忽略了。

我想轻轻擦除,重复擦除会完全删除图纸。

有什么想法吗?

编辑:根据请求,我添加了有关此代码的更多详细信息: alp = _brushAlpha是此ViewController类中的delcared属性。它的范围从0.1到1.0。在测试时我将其设置为0.5。此绘图代码由平移手势识别器(更改状态)触发。它基本上跟随手指(用手指画画/擦除)。

2 个答案:

答案 0 :(得分:1)

您已将混合模式设置为清除。这忽略了笔触颜色。您应该稍微使用各种模式,但我怀疑您需要像sourceAtop或屏幕这样的东西。有关详细信息,请参阅CGBlendMode docs

答案 1 :(得分:0)

你在UIView中有一个名为clearsContextBeforeDrawing的标志。如果你将它设置为YES,它将在每次抽奖前清除它。 根据文件

  

一个布尔值,用于确定在绘制之前是否应自动清除视图的边界。   设置为YES时,在调用drawRect:方法之前,绘图缓冲区将自动清除为透明黑色。此行为可确保在重绘视图的内容时不会留下任何可视工件。如果视图的opaque属性也设置为YES,则视图的backgroundColor属性不能为nil,否则可能会出现绘图错误。此属性的默认值为YES。   如果将此属性的值设置为NO,则您有责任确保在drawRect:方法中正确绘制视图的内容。如果您的绘图代码已经过大幅优化,那么将此属性设置为NO可以提高性能,尤其是在滚动时只需要重绘部分视图时。