我一直在玩一个自定义视图,它看起来像 Quartz 作曲家的补丁对象。我的假 Quartz Composer 视图看起来不错。这是一个单一的视图,具有 2 个不同的线性渐变、一个阴影和顶部的一条高光线,
我想将其扩展为圆角。这对于渐变等非常简单,但是,我不确定如何沿着视图顶部绘制弯曲的高光。例如,查看真实的 Quartz Composer UI,
我一直在尝试使用一种基于CGContextReplacePathWithStrokedPath()
. 我的目标是绘制弯曲路径(顶部突出显示),将路径转换为“描边路径”,然后用渐变填充生成的路径。但是,当我尝试这样做时,这种方法(至少是我的代码)实际上并没有绘制任何东西。
一些示例代码来显示该方法。请注意,该CGPathCallback
函数来自NSBezierPath+MCAdditions(我找不到代码的原始作者,但如果您搜索它会在很多地方出现)。
- (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];
}
问:沿着曲线绘制这样的高光最好的方法是什么,你会选择这种方法吗(这实际上不起作用!)?