尝试撤消上下文时出错

时间:2010-09-10 09:00:14

标签: iphone uikit cgcontext

我尝试从保存状态撤消myContext 然后我画线后我调用undo方法将我的上下文恢复到之前但它报告错误

<Error>: CGContextRestoreGState: invalid context

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

    UITouch *touch = [touches anyObject];   
    CGPoint currentPoint = [touch locationInView:self.view];
    UIGraphicsBeginImageContext(self.view.frame.size);
    [drawImage.image drawInRect:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];
    context = UIGraphicsGetCurrentContext();
    CGContextSaveGState(context);
    CGContextSetLineCap(context, kCGLineCapRound);
    CGContextSetLineWidth(UIGraphicsGetCurrentContext(), 5.0);
    CGContextSetRGBStrokeColor(UIGraphicsGetCurrentContext(), 1.0, 0.0, 0.0, 1.0);
    CGContextBeginPath(UIGraphicsGetCurrentContext());
    CGContextMoveToPoint(UIGraphicsGetCurrentContext(), lastPoint.x, lastPoint.y);
    CGContextAddLineToPoint(UIGraphicsGetCurrentContext(), currentPoint.x, currentPoint.y);
    CGContextStrokePath(UIGraphicsGetCurrentContext());
    drawImage.image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();    
}

- (void)undo {
    CGContextRestoreGState(context);
}

1 个答案:

答案 0 :(得分:2)

根据我从你那里读到的问题,我猜你正在尝试实现撤销,对吧? CGContextSaveGStateCGContextRestoreGState与此无关。

这两种方法仅在上下文中存储上下文的元数据。元数据,如当前绘图颜色,坐标系变换,线条粗细等。使用这些方法保留的此GState允许您撤消上下文的设置,而不是内容。你必须以不同的方式撤消......

也就是说,在长时间被销毁之后,你也会引用一个上下文。只要您调用UIGraphicsEndImageContext();,您之前存储在context变量中的上下文就会消失。这就是为什么要打印错误的原因。

要进行撤消,您可能必须存储您生成的图像或用户执行的操作或其他操作。 CGContexts不会帮助你...