1

我正在开发一个照片应用程序,您可以在其中在照片上画线。背景是照片,通过drawrect我在子视图上画线。

一切正常,但我如何擦除子视图上的线条(如橡皮擦),我尝试使用 clearColor 作为 setStroke。

是否可以像这样擦除线条。

4

3 回答 3

2

如果要使用完全透明的颜色进行绘制,则必须将混合模式设置为kCGBlendModeCopy任何效果。

这通常通过CGContextSetBlendMode函数来​​完成。如果你UIBezierPath用于绘图,你也可以使用该strokeWithBlendMode:alpha:方法。

于 2012-05-19T16:16:44.550 回答
1

@omz 给出的响应的实现可能是:(
假设imgBlank放置UIImageView在视图控制器的主视图之上)

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{
    UITouch *touch = [touches anyObject];
    CGPoint currentPoint = [touch locationInView:self.imgBlank];
    NSValue *valCurrPoint=[NSValue valueWithCGPoint:CGPointMake(currentPoint.x, currentPoint.y)];
    [self.dots addObject:valCurrPoint];
    [self performSelector:@selector(draw:) withObject:valCurrPoint afterDelay:0];
}

-(void)draw:(NSValue*)pointz{
    CGPoint point=[pointz CGPointValue];
    UIGraphicsBeginImageContextWithOptions(self.imgBlank.frame.size,NO,0);
    [self.imgBlank.image drawInRect:CGRectMake(0, 0, self.imgBlank.frame.size.width, self.imgBlank.frame.size.height)];
    CGContextSetLineCap(UIGraphicsGetCurrentContext(), kCGLineCapRound);
    CGContextSetLineWidth(UIGraphicsGetCurrentContext(),tickness);//set the tickness here
    CGContextSetBlendMode(UIGraphicsGetCurrentContext(), kCGBlendModeClear);
    CGContextSetRGBStrokeColor(UIGraphicsGetCurrentContext(), 1.0f, 1.0f, 1.0f, 1.0);
    CGContextBeginPath(UIGraphicsGetCurrentContext());  
    CGContextSetShouldAntialias(UIGraphicsGetCurrentContext(), YES);
    CGContextMoveToPoint(UIGraphicsGetCurrentContext(), _lastPoint.x, _lastPoint.y);
    CGContextAddLineToPoint(UIGraphicsGetCurrentContext(), point.x, point.y);
    CGContextStrokePath(UIGraphicsGetCurrentContext());
    self.imgBlank.image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    _lastPoint = point;
}
于 2012-05-19T17:49:34.857 回答
0

我尝试使用@omz 在 UIBezierPath 中使用 strokeWithBlendMode:alpha: 执行此操作的第二个建议:效果很好。这是代码:

if (pen) {
    [self updateColorFromPen];
    [path setLineWidth:3.0];
} else if (eraser) {
    [[UIColor clearColor] setStroke];
    [path setLineWidth:42.0];
    [path strokeWithBlendMode:kCGBlendModeCopy alpha:1];
}
于 2013-12-20T20:46:12.650 回答