Jea*_*uys 7 cocoa gradient core-graphics quartz-graphics
网上有很多资源,关于如何使用渐变 - 填充或描边进行绘制.
但是,AFAICT没有解决以下要求:如何绘制具有正常梯度的路径,其中法线意味着与路径正交.当使用暗 - >光 - >暗线性梯度时,净效应可以是牙膏或管.这是圆形矩形的想法:
圆形管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
Run Code Online (Sandbox Code Playgroud)

| 归档时间: |
|
| 查看次数: |
1530 次 |
| 最近记录: |