グラデーション、またはパターンなどのその他の塗りつぶし効果を使用して、任意のパスをストロークすることができます。
おわかりのように、ストローク パスは現在のグラデーションではレンダリングされません。塗りつぶされたパスのみがグラデーションを使用します (パスをクリップにしてからグラデーションを描画する場合)。
ただし、Core Graphics には、ストロークしようとしているパスを、塗りつぶしたときに同等CGContextReplacePathWithStrokedPath
のパスに変換する驚くほどクールな手順があります。
バックグラウンドで、CGContextReplacePathWithStrokedPath
ストローク パスの周囲にエッジ ポリゴンを構築し、定義したパスに切り替えます。Core Graphics レンダリング エンジンは、おそらくCGContextStrokePath
.
これに関するAppleのドキュメントは次のとおりです。
Quartz は、現在のグラフィックス コンテキストのパラメータを使用してストローク パスを作成します。新しいパスが作成されるため、塗りつぶすと元のパスをストロークするのと同じピクセルが描画されます。このパスは、任意のコンテキストのパスを使用するのと同じ方法で使用できます。たとえば、この関数を呼び出してから関数 CGContextClip を呼び出すと、パスのストローク バージョンにクリップできます。
したがって、パスを塗りつぶせるものに変換し、それをクリップに変換してから、グラデーションを描画します。グラデーションでパスをなぞったような効果が得られます。
コード
次のようになります…</p>
// Get the current graphics context.
//
const CGContextRef context = UIGraphicsGetCurrentContext();
// Define your stroked path.
//
// You can set up **anything** you like here.
//
CGContextAddRect(context, yourRectToStrokeWithAGradient);
// Set up any stroking parameters like line.
//
// I'm setting width. You could also set up a dashed stroke
// pattern, or whatever you like.
//
CGContextSetLineWidth(context, 1);
// Use the magical call.
//
// It turns your _stroked_ path in to a **fillable** one.
//
CGContextReplacePathWithStrokedPath(context);
// Use the current _fillable_ path in to define a clipping region.
//
CGContextClip(context);
// Draw the gradient.
//
// The gradient will be clipped to your original path.
// You could use other fill effects like patterns here.
//
CGContextDrawLinearGradient(
context,
yourGradient,
gradientTop,
gradientBottom,
0
);
その他の注意事項
上記のドキュメントの一部を強調する価値があります。
Quartz は、現在のグラフィック コンテキストのパラメータを使用してストローク パスを作成します。
明らかなパラメータは線幅です。ただし、ストローク パターン、マイター リミット、ライン ジョイン、キャップ、ダッシュ パターンなど、すべての線描画状態が使用されます。これにより、アプローチは非常に強力になります。
詳細については、この SO questionのこの回答を参照してください。