在网上和其他地方,都有许多关于如何使用渐变进行绘制的资源-填充或描边。

但是,AFAICT并没有满足以下要求:如何绘制具有法线渐变的路径,因此法线表示与该路径正交。当以深色->浅色->深色线性渐变应用时,最终效果可能像牙膏或管子。在圆形矩形的情况下是这样的:

round-rect tube http://muys.net/cadre_blanc.png

(这是手工绘制的,角落不是很好)。

在圆角矩形的特定情况下,我认为我可以通过4个线性渐变(侧面)和4个径向渐变(角落)来实现此效果。但是有更好的吗?

有没有简单的解决方案可以解决任何问题?

最佳答案

我能想到的唯一“简单”的解决方案是多次绘制路径,减小笔划宽度并每次稍微改变颜色,以模拟渐变。

显然,这对于复杂路径而言可能是一项昂贵的操作,因此,如果可能的话,您将希望缓存结果。

#define RKRandom(x) (arc4random() % ((NSUInteger)(x) + 1))

@implementation StrokeView

- (void)drawRect:(NSRect)rect
{
    NSRect bounds = self.bounds;

    //first draw using Core Graphics calls
    CGContextRef c = [[NSGraphicsContext currentContext] graphicsPort];

    CGMutablePathRef path = CGPathCreateMutable();

    CGPathMoveToPoint(path, NULL, NSMidX(bounds), NSMidY(bounds));
    CGContextSetMiterLimit(c,90.0);
    CGContextSetLineJoin(c, kCGLineJoinRound);
    CGContextSetLineCap(c, kCGLineCapRound);

    for(NSUInteger f = 0; f < 20; f++)
    {
        CGPathAddCurveToPoint(
                              path,
                              NULL,
                              (CGFloat)RKRandom((NSInteger)NSWidth(bounds)) + NSMinX(bounds),
                              (CGFloat)RKRandom((NSInteger)NSHeight(bounds)) + NSMinY(bounds),
                              (CGFloat)RKRandom((NSInteger)NSWidth(bounds)) + NSMinX(bounds),
                              (CGFloat)RKRandom((NSInteger)NSHeight(bounds)) + NSMinY(bounds),
                              (CGFloat)RKRandom((NSInteger)NSWidth(bounds)) + NSMinX(bounds),
                              (CGFloat)RKRandom((NSInteger)NSHeight(bounds)) + NSMinY(bounds)
                              );
    }

    for(NSInteger i = 0; i < 8; i+=2)
    {
        CGContextSetLineWidth(c, 8.0 - (CGFloat)i);
        CGFloat tint = (CGFloat)i * 0.15;

        CGContextSetRGBStrokeColor (
                                    c,
                                    1.0,
                                    tint,
                                    tint,
                                    1.0
                                    );
        CGContextAddPath(c, path);
        CGContextStrokePath(c);
    }

    CGPathRelease(path);

    //now draw using Cocoa drawing
    NSBezierPath* cocoaPath = [NSBezierPath bezierPathWithRoundedRect:NSInsetRect(self.bounds, 20.0, 20.0) xRadius:10.0 yRadius:10.0];
    for(NSInteger i = 0; i < 8; i+=2)
    {
        [cocoaPath setLineWidth:8.0 - (CGFloat)i];
        CGFloat tint = (CGFloat)i * 0.15;
        NSColor* color = [NSColor colorWithCalibratedRed:tint green:tint blue:1.0 alpha:1.0];
        [color set];
        [cocoaPath stroke];
    }
}

@end

关于cocoa - 核心图形: Drawing along a path with a normal gradient,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4921567/

10-11 00:01