1

したがって、軸に沿って一連の点線を描画する必要があります。drawRectメソッドで、別のメソッドを呼び出して軸を描画します。このメソッドでは、GStateを保存して軸を描画し、次にgstateを保存して、必要に応じて点線を再度描画します。次に、パスをストロークしてgstateを復元し、軸に何かを追加します。パスを埋めます..これで全体が点線になりました...gstateを復元したときに、コードが点線のパターンを破棄しなかったようです...

   CGContextSaveGState(ctx);
    CGContextSetFillColorWithColor(ctx, [[UIColor whiteColor] CGColor]);
 .......
    //draw a dased line
            CGContextSaveGState(ctx);
            CGContextSetLineWidth(ctx, 1.0);
            CGContextSetStrokeColorWithColor(ctx, [UIColor whiteColor].CGColor);
            CGFloat const kDashedLinesLength[]   = {1.0f, 0.5f};
            CGContextSetLineDash(ctx, 0.0, kDashedLinesLength, 2);
            CGContextMoveToPoint(ctx, LEFT_EXCLUSION_LENGTH + AXIS_LINE_WIDTH, crtYval);
            CGContextAddLineToPoint(ctx, LEFT_EXCLUSION_LENGTH + AXIS_LINE_WIDTH + self.xAxis.visibleLength , crtYval);
            CGContextStrokePath(ctx);
            CGContextRestoreGState(ctx);
...
   CGContextFillPath(ctx);
    CGContextRestoreGState(ctx);

必要な線だけが点線になるようにどうすれば痛くなりますか?

4

3 に答える 3

1

コードの何が問題になっているのかわかりませんが、コンテキスト復元のバグではなく、正常に機能します。置き換えたコードに別のエラーがある可能性があります....。

保存と復元のバランスが崩れている可能性があります。これにより、あらゆる種類の問題が発生します。最初に確認します。

最小限の変更でコピーして小さなiOSテストアプリのカスタムビューのdrawRectメソッドに貼り付けて実行したところ、期待どおりの結果が得られました。

期待どおりに機能する小さなテストコードは次のとおりです。

- (void)drawRect:(CGRect)rect
{
    // Drawing code

    CGContextRef ctx = UIGraphicsGetCurrentContext();

    CGContextSaveGState(ctx);
    CGContextSetFillColorWithColor(ctx, [[UIColor blackColor] CGColor]);
    CGContextSetStrokeColorWithColor(ctx, [UIColor blackColor].CGColor);
    CGContextSetLineWidth(ctx, 2.0);

    //draw a dased line
    CGContextSaveGState(ctx);
    CGContextSetStrokeColorWithColor(ctx, [UIColor blueColor].CGColor);
    CGFloat const kDashedLinesLength[]   = {1.0f, 2.0f};
    CGContextSetLineDash(ctx, 0.0, kDashedLinesLength, 2);
    CGContextMoveToPoint(ctx, 100, 100 );
    CGContextAddLineToPoint(ctx, 100, 200);
    CGContextStrokePath(ctx);
    CGContextRestoreGState(ctx);


    CGContextMoveToPoint(ctx, 200, 100 );
    CGContextAddLineToPoint(ctx, 200, 200);
    CGContextStrokePath(ctx);

    CGContextFillPath(ctx);
    CGContextRestoreGState(ctx);
}

そして、サンプル出力は次のとおりです。

スクリーンショット

于 2012-12-08T23:10:18.673 に答える
0

保存と復元のバランスを常に正確にとるように注意する必要があります。アプリのまったく異なる場所に、どちらか一方が多すぎるという状況がありました。iOSはコンテキストを部分的に再利用するため、グラフィックスコンテキストが奇妙な状態になる可能性があります。

ソースコードで保存と復元のすべてのインスタンスを検索し、それらの数が等しい場合はカウントする必要があります。

于 2012-12-10T09:29:04.827 に答える
0

私はあなたの問題を知っていると思います。このように見てください。パスをストロークするまで線は描画されません。したがって、たとえばCGContextAddLineToPointを呼び出すときに有効なパターンは、重要ではありません。線を引いていないCGContextAddLineToPointを呼び出すときは、単にパスを作成しているだけです。軸を描画するためのサブルーチンは、軸をストロークしないと思います。後でCGContextStrokePathを呼び出すまで、軸は描画されません。この時点で、破線のパターンが有効になります。

于 2012-12-11T15:49:05.617 に答える