0

保存状態から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);
}
4

1 に答える 1

2

私があなたの質問から読んだことから、あなたは元に戻るを実装しようとしていると思いますよね?CGContextSaveGStateそれとCGContextRestoreGStateは何の関係もありません。

これらの2つのメソッドは、コンテキストのメタデータのみをコンテキストに格納します。現在の描画色、座標系変換、線の太さなどのメタデータ。これらのメソッドを使用して保持するこのGStateを使用すると、コンテンツではなく、コンテキストの設定を元に戻すことができます。別の方法で元に戻す必要があります...

とは言うものの、あなたはそれが長い間破壊された後の文脈も参照します。を呼び出すとすぐに、以前に変数UIGraphicsEndImageContext();に保存していたコンテキストが失われます。contextそして、それがエラーが出力される理由です。

元に戻すには、生成した画像やユーザーが行ったアクションなどを保存する必要があります。CGContextsはそこであなたを助けません...

于 2010-09-10T09:09:03.507 に答える