在 UIBezierPath 图上应用渐变层

Posted

技术标签:

【中文标题】在 UIBezierPath 图上应用渐变层【英文标题】:Applying gradient layer over a UIBezierPath graph 【发布时间】:2018-06-12 14:41:18 【问题描述】:

这是我第一次提出问题,如果不是很彻底,请原谅我。

基本上,我试图在绘制为图形的 UIBezierPath 之上应用渐变层。

这是我的图表:

这是我要的渐变层:

这是我尝试绘制的图表:

let path = quadCurvedPathWithPoints(points: points)
let shapeLayer = CAShapeLayer()
shapeLayer.path = path.cgPath
shapeLayer.strokeColor = UIColor.blue.cgColor
shapeLayer.fillColor = UIColor.white.cgColor
shapeLayer.position = CGPoint(x: 0, y: 0)
shapeLayer.lineWidth = 1.0

显然,这会用蓝色笔触填充图形,但现在我正在尝试将白色应用到绿色渐变。我这样做的方式不起作用。结果如下:

这是我正在努力解决的代码:

let startColor = UIColor.white.withAlphaComponent(0.5)
let endColor = UIColor.green

let gradient = CAGradientLayer()
gradient.colors = [startColor.cgColor, endColor.cgColor]
gradient.startPoint = CGPoint(x: 0.0, y: 0.5)
gradient.endPoint = CGPoint(x: 1.0, y: 0.5)
gradient.frame = path.bounds
let shapeMask = CAShapeLayer()
shapeMask.path = path.cgPath
gradient.mask = shapeLayer
sparkLineView.layer.addSublayer(gradient)

【问题讨论】:

【参考方案1】:

这是一个使用渐变绘制UIBezierPath 路径的小演示。您可以将其复制到 Swift Playground 中。

class GradientGraph: UIView 
    override func draw(_ rect: CGRect) 
        // Create the "graph"
        let path = UIBezierPath()
        path.move(to: CGPoint(x: 0, y: frame.height * 0.5))
        path.addLine(to: CGPoint(x: frame.width * 0.2, y: frame.height * 0.3))
        path.addLine(to: CGPoint(x: frame.width * 0.4, y: frame.height * 0.8))
        path.addLine(to: CGPoint(x: frame.width * 0.6, y: frame.height * 0.4))
        path.addLine(to: CGPoint(x: frame.width * 0.8, y: frame.height * 0.7))

        // Create the gradient
        let gradient = CGGradient(colorsSpace: nil, colors: [UIColor.white.cgColor,UIColor.green.cgColor] as CFArray, locations: nil)!

        // Draw the graph and apply the gradient
        let ctx = UIGraphicsGetCurrentContext()!
        ctx.setLineWidth(6)

        ctx.saveGState()
        ctx.addPath(path.cgPath)
        ctx.replacePathWithStrokedPath()
        ctx.clip()
        ctx.drawLinearGradient(gradient, start: CGPoint(x: 0, y: 0), end: CGPoint(x: frame.width, y: 0), options: [])
        ctx.restoreGState()
    


let graph = GradientGraph(frame: CGRect(x: 0, y: 0, width: 700, height: 700))

【讨论】:

哇!这正是我想要做的!说真的,非常感谢。 你是我的英雄!谢谢!

以上是关于在 UIBezierPath 图上应用渐变层的主要内容,如果未能解决你的问题,请参考以下文章

UIBezierPath下绘制渐变

带有颜色渐变的 UIBezierPath

使用 UIBezierPath 绘制 100 多个不同位置的圆圈

iOS 绘制颜色渐变圆环

iOS 绘制颜色渐变圆环 --- 值得一看

如何使用 Windows API 将菜单背景渐变复制或再现到位图上?