1

カスタム コントロールでは、コントロールを描画するために必要な線と弧を含むいくつかの CGMutablePathRefs を定義しました。1 つは全体的な塗りつぶし形状を描画し、もう 1 つはスペキュラー ハイライトを提供します。コントロールのアクティブ状態と非アクティブ状態のクリッピング マスクとして必要なパスを含む 2 つの CGMutablePathRef も定義しました。

私が苦労しているのは、クリッピングパスを適用することです。以前、画像にグラデーションを適用するためにクリッピング パスを使用しましたが、これらの描画コマンドは CGPath... ではなく CGContext... の種類でした。

テストの目的で、スペキュラー ハイライトの描画の側面を削除しました。大きなパスを小さなパスにクリップするだけです。これは私がテストしていたものです:

- (void)drawRect:(CGRect)rect
{
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    CGContextBeginPath(ctx);
    CGContextAddPath(ctx, inactiveClip); 
    CGContextClosePath(ctx);
    CGContextClip(ctx);

    CGContextAddPath(ctx, frontFace);
    CGContextSetLineWidth(ctx, 1.0);
    CGContextSetFillColorWithColor(ctx, [[UIColor blackColor] CGColor]);
    CGContextFillPath(ctx);

}

クリッピング コマンドを描画の前に置くことで、CoreGraphics に「実際に描画する領域はここにあります」と言っているように思えました。

ああ、何も描かれていません。

したがって、逆順で注文したと仮定して、次のことを試しました。

- (void)drawRect:(CGRect)rect
{
    CGContextRef ctx = UIGraphicsGetCurrentContext();

    CGContextAddPath(ctx, frontFace);
    CGContextSetLineWidth(ctx, 1.0);
    CGContextSetFillColorWithColor(ctx, [[UIColor blackColor] CGColor]);
    CGContextFillPath(ctx);

    CGContextBeginPath(ctx);
    CGContextAddPath(ctx, inactiveClip); 
    CGContextClosePath(ctx);
    CGContextClip(ctx);

}

これは、CoreGraphics に対して、「実際にビットに色を付ける前に、このクリッピング領域に対してチェックしてください」と言うことでした。

残念ながら、何も切り取られていません。

クリッピング パスがフィル パスと同じポイントとコントロール ポイントのいくつかを同じ順序で使用する場合があるため、CGContextClip の呼び出しを CGContextEOClip の呼び出しに置き換えて、本当に苦労しているかどうかを確認しました。偶奇規則ですが、視覚的な影響はないようです。

CGContextAddPath 呼び出しを CGContextBeginPath/CGContextClosePath 呼び出しで囲む必要があるかどうかはよくわかりませんが、私がしようとしていたのは、Apple のサンプル コードと私のコードの違いを最小限に抑えることでした。彼らは CGContext... begin/close 呼び出しの間に呼び出しを描画するので、私もそうでした。

ここで私は何を誤解していますか?

4

0 に答える 0