如何擦除子视图中的行

时间:2012-05-19 15:24:18

标签: iphone objective-c uiviewcontroller drawrect

我正在开发一款可以在照片上画线的照片应用。 背景是照片,通过画布我在子视图上画线。

每件事都有效,但如何擦除子视图上的线条(如橡皮擦),我尝试使用clearColor作为setStroke。

是否可以删除这样的行。

3 个答案:

答案 0 :(得分:2)

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

这通常使用CGContextSetBlendMode函数完成。如果您使用UIBezierPath进行绘图,则还可以使用strokeWithBlendMode:alpha:方法。

答案 1 :(得分:1)

@omz给出的响应的实现可以是:
(假设imgBlank是放置在viewcontroller主视图顶部的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;
}

答案 2 :(得分: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];
}