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

时间:2010-04-29 14:08:16

标签: cocoa macos core-graphics quartz-graphics

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

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

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

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

3 个答案:

答案 0 :(得分:20)

如果将NSBezierPath转换为CGPath,则可以使用CGContextReplacePathWithStrokedPath()方法检索作为描边路径轮廓的路径。格雷厄姆考克斯出色的 GCDrawKit -strokedPath上有一个NSBezierPath类别方法,可以为您完成此操作,而无需下载到Core Graphics。

获得概述路径后,您可以使用NSGradient填充该路径。

答案 1 :(得分:14)

  

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

[原始答案替换为以下]

啊,我明白了。您想将渐变应用于笔划。

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

  1. 开始transparency layer
  2. 使用任何不透明的颜色描绘路径。
  3. Set the blend modesource in
  4. 绘制渐变。
  5. 结束透明层。

答案 2 :(得分:8)

根据Peter Hosey的回答,我设法做了一个简单的渐变曲线,看起来像这样:

Gradient Curve Image

我通过编写下面的代码在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)
}

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