我尝试从保存状态撤消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);
}
答案 0 :(得分:2)
根据我从你那里读到的问题,我猜你正在尝试实现撤销,对吧? CGContextSaveGState
和CGContextRestoreGState
与此无关。
这两种方法仅在上下文中存储上下文的元数据。元数据,如当前绘图颜色,坐标系变换,线条粗细等。使用这些方法保留的此GState允许您撤消上下文的设置,而不是内容。你必须以不同的方式撤消......
也就是说,在长时间被销毁之后,你也会引用一个上下文。只要您调用UIGraphicsEndImageContext();
,您之前存储在context
变量中的上下文就会消失。这就是为什么要打印错误的原因。
要进行撤消,您可能必须存储您生成的图像或用户执行的操作或其他操作。 CGContexts不会帮助你...