Применение градиентного слоя над графиком UIBezierPath - PullRequest
0 голосов
/ 12 июня 2018

Я впервые задаю вопрос, так что извините, если он не очень тщательный.

В основном я пытаюсь применить слой градиента поверх UIBezierPath, который рисуется как график.

Вот мой график:

normal graph

Вот градиентный слой, для которого я собираюсь:

gradient graph

Вот то, что я пытался нарисовать на графике:

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

Очевидно, это заполняет график синим штрихом, но теперь я пытаюсь применить градиент от белого к зеленому.То, как я это делаю, не работает.Вот результат:

fail gradient graph

Вот код, с которым я борюсь:

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 Ответ

0 голосов
/ 12 июня 2018

Вот небольшая демонстрация, которая рисует путь UIBezierPath с использованием градиента.Вы можете скопировать это на игровую площадку Swift.

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))
...