Quartz composer の patch オブジェクトのようなカスタム ビューをいじってみました。私の偽の Quartz Composer ビューは十分に見栄えがします。これは、2 つの異なる線形グラデーション、影、上部に 1 つのハイライト ラインを持つ単一のビューです。
これを拡張して角を丸くしたいと思います。これはグラデーションなどでは非常に簡単ですが、ビューの上部に沿って曲線のハイライトを描画する方法がわかりません。たとえば、実際の Quartz Composer UI を参照してください。
に基づいたアプローチを使用しようとしていますCGContextReplacePathWithStrokedPath()
。私の目標は、曲線のパス (上部のハイライト) を描画し、パスを「ストローク パス」に変換してから、結果のパスをグラデーションで塗りつぶすことです。ただし、このアプローチ (少なくとも私のコード) は、これを試みても実際には何も描画しません。
メソッドを示すサンプルコード。関数はNSBezierPath+MCAdditionsから来ていることに注意してください(コードの元の作成者は見つかりませんが、検索すると多くの場所で見つかります)。CGPathCallback
- (void)drawRect:(NSRect)dirtyRect
{
/* Make any line you like */
CGContextRef context = [[NSGraphicsContext currentContext] graphicsPort];
CGMutablePathRef centerline = CGPathCreateMutable();
CGContextSetLineWidth(context, 10.);
CGPathMoveToPoint(centerline, NULL, NSMinX(dirtyRect), NSMidY(dirtyRect));
CGPathAddLineToPoint(centerline, NULL, NSMaxX(dirtyRect), NSMidY(dirtyRect));
CGContextAddPath(context, centerline);
/* Make a line "fill-able" */
CGContextReplacePathWithStrokedPath(context);
/* Clip to this line (maybe not required?)*/
CGContextClip(context);
/* Convert to a NSBezierPath */
NSBezierPath *centrePath = [NSBezierPath bezierPath];
CGPathApply(centerline, (__bridge void *)(centrePath), CGPathCallback);
/* Finally fill the line with the gradient */
NSGradient *lineGradient = [[NSGradient alloc] initWithStartingColor:[NSColor redColor] endingColor:[NSColor greenColor]];
[lineGradient drawInBezierPath:centrePath angle:-90];
}
Q.曲線に沿ってこのようなハイライトを描画する最良の方法は?