iPhone Кварц Ластик для рисования - PullRequest
3 голосов
/ 10 февраля 2012

Я пытаюсь сделать приложение для iPhone со стиранием.Я сталкиваюсь с 2 проблемами, если у вас есть решение для любой из них, пожалуйста, ответьте на это.Я хотел бы стереть часть изображения.

1) В настоящее время я просто очищаю прямоугольник, но у него квадратный край.Я хотел бы, чтобы это было круглым, я ранее пробовал переводить, но это не работает.Мне также нужно, чтобы он переводил / вращал как можно меньше раз, чтобы поддерживать ту же производительность.

2) Кроме того, я хотел знать, есть ли другие способы удаления.При быстром стирании стирается всегда 1/2 дюйма.Есть ли способ обвести путь и очистить прямоугольник или что-то?Извините, если это трудно понять.

CGRect circleRect = CGRectMake([touch CGPointValue].x, [touch CGPointValue].y, 25, 25);
CGContextClearRect(currentContext,circleRect);

enter image description here

Ответы [ 2 ]

5 голосов
/ 10 февраля 2012

Этот код должен делать то, что вы ищете:

CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetLineCap(context, kCGLineCapRound);
CGContextSetLineWidth(context, self.strokeWidth);
CGContextSetBlendMode(context, kCGBlendModeClear);
CGContextSetStrokeColorWithColor(context, [[UIColor clearColor] CGColor]);
CGContextBeginPath(context);
CGContextMoveToPoint(context, lastPoint.x, lastPoint.y);
CGContextAddLineToPoint(context, currentPoint.x, currentPoint.y);
CGContextStrokePath(context);     
CGContextFlush(context);

Ключевые точки:

1) CGContextSetLineCap(context, kCGLineCapRound), что округляет

2) CGContextSetBlendMode(context, kCGBlendModeClear), который очищает контекст.

2 голосов
/ 04 ноября 2015

Я понимаю, что это более старый вопрос, но я решил расширить ответ Эрика Рейда, поскольку я пытался использовать его пример вне метода drawRect и должен был изменить его, чтобы он работал с контекстом, который я создал в Метод touchesMoved в подклассе UIView.

Я вызываю этот метод из 'touchesMoved' и передаю CGPoint касания в представлении, в котором я рисую.

-(void) processEraseAtPoint:(CGPoint)point
{
    // setup a context with the size of our canvas view (the canvas view is the UIView instance I'm drawing into)
    UIGraphicsBeginImageContext(self.canvasView.bounds.size);

    // get a reference to the context we just created
    CGContextRef context = UIGraphicsGetCurrentContext();

    // draw the image we want to edit into this context (this is the image containing the drawing I want to erase part of)
    [self.canvasView.incrementalImage drawAtPoint:CGPointZero];

    // set our context options
    CGContextSetLineCap(context, kCGLineCapRound);
    CGContextSetLineWidth(context, self.canvasView.settings.brushDiameter);
    CGContextSetBlendMode(context, kCGBlendModeClear);

    // make the color clear since we're erasing
    CGContextSetStrokeColorWithColor(context, [[UIColor clearColor] CGColor]);

    // start our path in this context
    CGContextBeginPath(context);

    // set our first point
    CGContextMoveToPoint(context, lastTouch.x, lastTouch.y);

    // draw from our last point to this point
    CGContextAddLineToPoint(context, point.x, point.y);

    // stroke this path (in this case it's clear so it will erase what's there)
    CGContextStrokePath(context);

    // set our incrementalImage in the canvasView with the updated image from this context
    // Note that in the canvasView 'drawRect' method I am calling 
    // '[self.incrementalImage drawInRect:rect]', so this new image will get drawn 
    // in my canvasView when I call 'setNeedsDisplay'
    self.canvasView.incrementalImage = UIGraphicsGetImageFromCurrentImageContext();

    // cleanup our context
    CGContextFlush(context);
    UIGraphicsEndImageContext();

    // set our last touch point for the next line segment
    lastTouch = point;

    // update our view
    [self.canvasView setNeedsDisplay];

}
...