CGBitmapContextСоздать с отменой не работает хорошо - PullRequest
1 голос
/ 04 мая 2019

Я боролся с функцией отмены в течение нескольких дней, и я действительно понятия не имею, чтобы решить эту проблему.

Я делаю функцию рисования на UIViewController, который использует пользовательский UIimageView.

Проблема в том, что когда я вызвал функцию Отменить, предыдущий рисунок прошел хорошо, но когда я попытался нарисовать снова, тогда удаленный рисунок снова появился с текущим рисунком.

вот мой код.Если вы видите какие-либо проблемы, пожалуйста, дайте мне знать!Это будет действительно полезно.Спасибо!

- (IBAction)Pan:(UIPanGestrueRecognizer *)pan {
    CGContextRef ctxt = [self drawingContext];

    CGContextBeginPath(ctxt);
    CGContextMoveToPoint(ctxt, previous.x, previous.y);
    CGContextAddLineToPoint(ctxt, current.x, current.y);
    CGContextStrokePath(ctxt);

    CGImageRef img = CGBitmapContextCreateImage(ctxt);
    self.costomImageView.image = [UIImage imageWithCGImage:img];
    CGImageRelease(img);
    previous = current;
    ...
}

- (CGContextRef)drawingContext {
    if(!context) { // context is an instance variable of type CGContextRef
        CGImageRef image = self.customImageView.image.CGImage;
        CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
        if(!colorSpace) return nil;
        context = CGBitmapContextCreate(NULL,
                                        CGImageGetWidth(image), CGImageGetHeight(image),
                                        8, CGImageGetWidth(image) * 4,
                                        colorSpace, kCGImageAlphaPremultipliedLast
                                        );
        CGColorSpaceRelease(colorSpace);
        if(!context) return nil;
        CGContextConcatCTM(context, CGAffineTransformMake(1,0,0,-1,0,self.customeImageView.image.size.height));

        CGContextSaveGState(context);
        CGContextTranslateCTM(context, 0.0, self.customImageView.image.size.height);
        CGContextScaleCTM(context, 1.0, -1.0);
        CGContextDrawImage(context, (CGRect){CGPointZero,self.customImageView.image.size}, image);
        CGContextRestoreGState(context);

        CGContextSetLineCap(context, kCGLineCapRound);
        CGContextSetLineWidth(context, 4.f);
        CGContextSetStrokeColorWithColor(context, [UIColor redColor].CGColor);
    }
    return context;
}

1 Ответ

1 голос
/ 04 мая 2019

Я не уверен, что то, что вы пытаетесь сделать, поддерживается UndoManager

Что бы я лично сделал, это примерно так:

  1. Создайте NSMutableArray, чтобы содержать все ваши штрихи рисования. Структура с двумя экземплярами Point должна выполнять эту задачу. Если вы хотите заняться модой, вы можете добавить экземпляр UIColor, чтобы установить цвет, а также другие переменные для другой информации о стиле.

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

  3. Есть процедура рендеринга, которая очищает графический контекст, выполняет итерацию по массиву и рисует на экране.

Для отмены функций все, что вам нужно сделать, это удалить последнюю запись из массива и выполнить повторную визуализацию.

...