CGBitmapContextCreate撤消效果不佳

时间:2019-05-04 12:24:27

标签: ios objective-c image core-graphics

我已经在使用undo功能上苦苦挣扎了几天,我真的不知道要解决这个问题。

我正在使用自定义UIimageView的UIViewController上执行绘图功能。

问题是,当我触发撤消功能时,先前的图形进行得很好,但是当我尝试再次绘制时,删除的图形又与当前图形一起出现。

这是我的代码。 如果您发现任何问题,请告诉我!这将非常有帮助。 谢谢!

- (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 个答案:

答案 0 :(得分:1)

我不确定UndoManager

是否支持您的工作

我个人要做的是这样的:

  1. 创建一个NSMutableArray来包含您所有的绘画笔触。其中有两个Point实例的结构应完成此任务。如果想花哨的话,可以添加一个UIColor实例来设置颜色以及其他样式信息的更多变量。

  2. 开始平移手势时,记录其开始的点。结束时,记录该点,创建结构的实例并将其添加到数组中。

  3. 具有一个渲染过程,该过程可以清除图形上下文,遍历数组并绘制到屏幕。

对于撤消功能,您需要做的就是从阵列中删除最后一个条目并重新渲染。