カスタム コントロールでは、コントロールを描画するために必要な線と弧を含むいくつかの 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 呼び出しの間に呼び出しを描画するので、私もそうでした。
ここで私は何を誤解していますか?