我设法在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。此绘图代码由平移手势识别器(更改状态)触发。它基本上跟随手指(用手指画画/擦除)。
答案 0 :(得分:1)
您已将混合模式设置为清除。这忽略了笔触颜色。您应该稍微使用各种模式,但我怀疑您需要像sourceAtop或屏幕这样的东西。有关详细信息,请参阅CGBlendMode docs。
答案 1 :(得分:0)
你在UIView中有一个名为clearsContextBeforeDrawing的标志。如果你将它设置为YES,它将在每次抽奖前清除它。 根据文件
一个布尔值,用于确定在绘制之前是否应自动清除视图的边界。 设置为YES时,在调用drawRect:方法之前,绘图缓冲区将自动清除为透明黑色。此行为可确保在重绘视图的内容时不会留下任何可视工件。如果视图的opaque属性也设置为YES,则视图的backgroundColor属性不能为nil,否则可能会出现绘图错误。此属性的默认值为YES。 如果将此属性的值设置为NO,则您有责任确保在drawRect:方法中正确绘制视图的内容。如果您的绘图代码已经过大幅优化,那么将此属性设置为NO可以提高性能,尤其是在滚动时只需要重绘部分视图时。