7

CALayer サブクラス内の描画関数内でアークを描画するときに問題が発生します。その描画関数の実装は次のとおりです。

-(void)drawInContext:(CGContextRef)ctx
{
    CGPoint center = CGPointMake(self.bounds.size.width/2, self.bounds.size.height/2);
    CGFloat radius = MIN(center.x, center.y);

    CGContextBeginPath(ctx);

    CGContextAddArc(ctx, center.x, center.y, radius, DEG2RAD(0), DEG2RAD(90), YES);

    CGContextSetStrokeColorWithColor(ctx, [UIColor whiteColor].CGColor);
    CGContextSetLineWidth(ctx, 5);

    CGContextDrawPath(ctx, kCGPathStroke);
}

ここで画期的なことは何もありませんが、奇妙なことに、時計回りに指定したにもかかわらず、円弧が反時計回りに描かれています。逆に、時計回りのパラメーターに NO を指定すると、円弧が時計回りに描画されます。私は反転された座標系についていくつかの調査を行い、それがここでの問題である可能性があると考えましたが、私が意図したものとは反対の bool パラメーターをハードコーディングしたくありませんでした。これを修正する方法について何か提案はありますか?

ありがとう!

4

1 に答える 1

9

これは実際、UIKit と Quartz の反転した座標系によるものです。CGContextのドキュメントから:

時計回りのパラメーターは、円弧が作成される方向を決定します。最終パスの実際の方向は、グラフィックス コンテキストの現在の変換行列に依存します。たとえば、iOS では、UIView は Y 値を -1 でスケーリングすることによって Y 座標を反転します。反転座標系では、時計回りの円弧を指定すると、変換が適用された後に反時計回りの円弧になります。

変換マトリックスを使用してコンテキストを反転することにより、コードでこれを軽減できます。

CGContextTranslateCTM(ctx, 0.0, self.bounds.size.height);
CGContextScaleCTM(ctx, 1.0, -1.0);

描画が終了したら、おそらく元に戻したいと思うでしょう。

CGContextSaveGState(ctx);
CGContextTranslateCTM(ctx, 0.0, self.bounds.size.height);
CGContextScaleCTM(ctx, 1.0, -1.0);

// Draw...

CGContextRestoreGState(ctx);
于 2013-06-07T00:22:45.950 に答える