Рисование и стирание линий с помощью касания - PullRequest
1 голос
/ 06 июня 2011

У меня есть фоновое изображение (ImageBG) и изображение переднего плана (ImageFG) в отдельных UIImageViews.Они имеют одинаковый размер, и, как следует из названия, ImageBG находится позади ImageFG, поэтому вы не можете видеть ImageBG.

Если пользователь начинает «рисовать» на них, вместо линии, появляющейся там, где пользователь касается экрана, я хочу, чтобы эта часть ImageFG стала прозрачной и раскрыла ImageBG.

Самая близкая вещь, о которой я могу подумать, - это игра с нуля и выигрыш.

Я знаю, как рисовать в графическом контексте, но когда я рисую прозрачную линию (альфа = 0), хорошо ... Я получаю прозрачную линию поверх всего, что в данный момент находится в моем графическом контекстетак что в принципе ничего не нарисовано.Это то, что я использую для установки цвета обводки.

CGContextSetRGBStrokeColor(UIGraphicsGetCurrentContext(), 1.0, 0.0, 0.0, 0.0)

Что я делаю не так?Я знаю, что это возможно, потому что есть приложения, которые делают это.

Любые советы, советы или указания приветствуются.

1 Ответ

10 голосов
/ 05 августа 2011

Итак, у вас есть слой, представляющий собой изображение, похожее на серый материал, который вы хотите вычеркнуть, вы записываете это изображение (в этом примере 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...