Intereting Posts
Получение кода ошибки 32 из Twitter при извлечении сведений о пользователях с помощью Social Framework & SLRequest UITraitCollection iPad, как определить текущую ориентацию IOS 8 iPad делает только портрет только на экране запуска _OBJC_CLASS _ $ _ ScringoAgent ", на который ссылаются: Сохранение данных NSUserDefault и отображение их в виде таблицы Как создать CGPath из файла – то есть SVG Петля между двумя NSDates в Objective C Xamarin iOS UIButton скрыть / показать Как получить изображение Html от Json в OBJECTIVE C Обнаружение didReceiveLocalNotification, поступающее от диспетчера уведомлений против реального времени Шаблон, соответствующий NSDictionary в NSArray с Swift завершение с неперехваченным исключением типа NSException ionic Как реализовать защиту данных iOS в приложении iOS 8 по XCode 6.1 project-> target-> Capabilities-> Data Protection? Шифрование данных ядра iOS с использованием NSValueTransformer Ограничения просмотра iOS

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

У меня есть фоновое изображение (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; }