Итак, у вас есть слой, представляющий собой изображение, похожее на серый материал, который вы хотите вычеркнуть, вы записываете это изображение (в этом примере scratchImage, которое представляет собой UIImageView и его UIImage .image) в графический контекст.Затем вы обводите его, установив режим смешивания kCGBlendModeClear, затем сохраняете это изображение (с очищенными путями).Это покажет изображение, которое у вас есть, возможно, в другом UIImageView.Обратите внимание, что в этом случае self - это UIView.
Так что за пределами touchesMoved создайте переменную для хранения CGPoint
CGPoint previousPoint;
CGPoint currentPoint;
Затем в touchesBegan установите ее на предыдущую точку.
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
UITouch *touch = [touches anyObject];
previousPoint = [touch locationInView:self];
}
В touchesMoved запишите изображение в контекст, обведите изображение в режиме прозрачного наложения, сохраните изображение из контекста и установите предыдущую точку в текущую точку.
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
UITouch *touch = [touches anyObject];
currentPoint = [touch locationInView:self];
UIGraphicsBeginImageContext(self.frame.size);
//This may not be necessary if you are just erasing, in my case I am
//adding lines repeatedly to an image so you may want to experiment with moving
//this to touchesBegan or something. Which of course would also require the begin
//graphics context etc.
[scratchImage.image drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)];
CGContextSaveGState(UIGraphicsGetCurrentContext());
CGContextSetShouldAntialias(UIGraphicsGetCurrentContext(), YES);
CGContextSetLineCap(UIGraphicsGetCurrentContext(), kCGLineCapRound);
CGContextSetLineWidth(UIGraphicsGetCurrentContext(), 5.0);
CGContextSetRGBStrokeColor(UIGraphicsGetCurrentContext(), 0.25, 0.25, 0.25, 1.0);
CGMutablePathRef path = CGPathCreateMutable();
CGPathMoveToPoint(path, nil, previousPoint.x, previousPoint.y);
CGPathAddLineToPoint(path, nil, currentPoint.x, currentPoint.y);
CGContextSetBlendMode(UIGraphicsGetCurrentContext(), kCGBlendModeClear);
CGContextAddPath(UIGraphicsGetCurrentContext(), path);
CGContextStrokePath(UIGraphicsGetCurrentContext());
scratchImage.image = UIGraphicsGetImageFromCurrentImageContext();
CGContextRestoreGState(UIGraphicsGetCurrentContext());
UIGraphicsEndImageContext();
previousPoint = currentPoint;
}