Очистить строки CGContext

Как только я нарисовал несколько линий поверх UIImage (например, кистью), я хочу их очистить, как резину. Я много искал на этом сайте и в Google, попробовал несколько кодов, но не смог найти правильного решения. Вот код, который я использую для написания:

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {

    if(isDrawing == YES) {

        UITouch *touch = [touches anyObject];
        CGPoint currentPoint = [touch locationInView:mainImageView.superview];

        UIGraphicsBeginImageContext(mainImageView.frame.size);
        [mainImageView.image drawInRect:CGRectMake(0, 0, mainImageView.frame.size.width, mainImageView.frame.size.height)];

        CGContextSetLineCap(UIGraphicsGetCurrentContext(), kCGLineCapRound);
        CGContextSetLineWidth(UIGraphicsGetCurrentContext(), dimension);

        const CGFloat *components = CGColorGetComponents([color CGColor]);
        CGContextSetRGBStrokeColor(UIGraphicsGetCurrentContext(), components[0], components[1], components[2], components[3]);

        CGContextBeginPath(UIGraphicsGetCurrentContext());
        CGContextMoveToPoint(UIGraphicsGetCurrentContext(), lastPoint.x, lastPoint.y);
        CGContextAddLineToPoint(UIGraphicsGetCurrentContext(), currentPoint.x, currentPoint.y);
        CGContextStrokePath(UIGraphicsGetCurrentContext());

        mainImageView.image = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();

        lastPoint = currentPoint;

    } else {
        //Clear current line (like a rubber would do)
    }
}

person Mark Wallace    schedule 25.01.2013    source источник


Ответы (3)


В этом случае [UIColor clearColor] не сработает, используйте CGContextClearRect(context,rect);, чтобы очистить регион!

person Asif Mujteba    schedule 25.01.2013

Заполните желаемую часть контекста символом [UIColor clearColor].

person Gobra    schedule 25.01.2013

Правильный подход - использовать путь Безье, который:

  • записывает все рисунки (но на самом деле НЕ рисует .. в DrawRect мы будем рисовать .. с помощью "обводки")
  • имеет толщину, цвет и тд ...
  • эффективно привлекает внимание

Очистка (с помощью «removeAllPoints») и вызов setNeedsDisplay заставит фон снова появиться.

Если вы хотите очистить контур, который вы написали, с помощью другого инструмента (скажем, вы используете инструмент карандаша, чтобы писать синим цветом ... и инструмент резины, чтобы очистить синие линии и сделать фон, чтобы он снова появился), вы можете использовать "containsPoint:" чтобы удалить некоторые точки из траектории Безье.

Мы так и поступили.

использование пути Безье НЕ тривиально, но очень увлекательно .. :)

person ingconti    schedule 03.08.2013