在OSX上,如何渐变填充路径笔划?

Emi*_*iel 15 macos cocoa core-graphics

使用Cocoa或Quartz中的大量绘图函数,绘制路径相当容易,并使用渐变填充它们.然而,我似乎无法找到一种可接受的方式,"笔画" - 绘制一条线宽为几个像素的路径并使用渐变填充此笔划.这是怎么做到的?

编辑:显然问题不够明确.感谢到目前为止的回复,但我已经明白了.我想要做的是:

广场http://emle.nl/forumpics/misc/squares.png

左方框是在路径中绘制的NSGradient,后跟路径笔划消息.权利就是我想要做的; 我想用渐变填充笔划.

Rob*_*ger 20

如果将其转换NSBezierPath为a CGPath,则可以使用该CGContextReplacePathWithStrokedPath()方法检索作为描边路径轮廓的路径.格雷厄姆考克斯出色的GCDrawKit有一个-strokedPath类别方法NSBezierPath可以为你做这个,而不需要下载到核心图形.

获得轮廓路径后,可以使用NSGradient.填充该路径.


Pet*_*sey 14

然而,我似乎无法找到一种可接受的方式,"笔画" - 绘制一条线宽为几个像素的路径并使用渐变填充此笔划.这是怎么做到的?

[原始答案替换为以下]

啊,我明白了.您想要将渐变应用于笔触.

为此,您使用混合模式.我在另一个问题的答案中解释了如何做到这一点.以下是适合您目标的步骤列表:

  1. 开始透明层.
  2. 使用任何非透明颜色描边路径.
  3. 将混合模式设置source in.
  4. 绘制渐变.
  5. 结束透明层.


Bar*_*ski 8

根据Peter Hosey的回答,我设法做了一个简单的渐变曲线,如下所示:

渐变曲线图像

我通过编写下面的代码在UIView类的drawRect(_ :)方法中完成了这个:

override func drawRect(rect: CGRect) {
    let context = UIGraphicsGetCurrentContext()

    CGContextBeginTransparencyLayer (context, nil)
    let path = createCurvePath()
    UIColor.blueColor().setStroke()
    path.stroke()
    CGContextSetBlendMode(context, .SourceIn)

    let colors          = [UIColor.blueColor().CGColor, UIColor.redColor().CGColor]
    let colorSpace      = CGColorSpaceCreateDeviceRGB()
    let colorLocations  :[CGFloat] = [0.0, 1.0]
    let gradient        = CGGradientCreateWithColors(colorSpace, colors, colorLocations)
    let startPoint      = CGPoint(x: 0.0, y: rect.size.height / 2)
    let endPoint        = CGPoint(x: rect.size.width, y: rect.size.height / 2)

    CGContextDrawLinearGradient(context, gradient, startPoint, endPoint, CGGradientDrawingOptions.DrawsBeforeStartLocation)
    CGContextEndTransparencyLayer(context)
}
Run Code Online (Sandbox Code Playgroud)

函数createCurvePath()返回UIBezierPath对象.我还将path.lineWidth设置为5分.