Intereting Posts

Рисование и стирание линий с прикосновением

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

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

Самое близкое, что я могу придумать, – это царапины и победа.

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

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

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

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

Таким образом, у вас есть слой, который представляет собой некоторый образ, похожий на серый материал, который вы хотите поцарапать, вы пишете это изображение (в этом примере scratchImage, который является UIImageView и его UIImage .image) в графическом контексте. Затем вы поглаживаете его с режимом наложения, установленным на kCGBlendModeClear, затем вы сохраняете это изображение (с очищенными путями). Это покажет образ, который у вас есть, возможно, в другом UIImageView. Обратите внимание, что в этом случае self является UIView.

Таким образом, внешние касания. Создайте переменную для хранения CGPoint.

 CGPoint previousPoint; CGPoint currentPoint; 

Затем в touchBegan установите его в предыдущую точку.

 - (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; }