【问题标题】:swift how to make gradient layer start at different positionswift如何使渐变层从不同的位置开始
【发布时间】:2019-12-27 02:41:44
【问题描述】:

我正在编写面积图,无法上传实际图像,所以我画了一个插图。

所以我使用了两层,一层绘制区域,另一层绘制渐变。

下面是代码:

 let area = CGMutablePath()
    let zero = CGFloat(scaleValueOnYAxis(min!.y))

    area.move(to: CGPoint(x: CGFloat(xValues[0]), y: zero))
    for i in 0..<xValues.count {
        area.addLine(to: CGPoint(x: CGFloat(xValues[i]), y: CGFloat(yValues[i])))
    }
    area.addLine(to: CGPoint(x: CGFloat(xValues.last!), y: zero))
    let areaLayer = CAShapeLayer()
    areaLayer.frame = self.bounds
    areaLayer.path = area
    areaLayer.strokeColor = nil
    areaLayer.lineWidth = 0
    layers.append(areaLayer)
    self.layer.addSublayer(areaLayer)

    //draw the gradient layer
    let gradient = CAGradientLayer()
    let startColor = SomeColor.cgColor
    let endColor = SomeOtherColor.cgColor
    let gradientAngle = 0
    let angle = CGPoint.convert(angle: gradientAngle)

    gradient.frame = self.bounds
    gradient.colors = [startColor.cgColor, endColor.cgColor]

    if let _gradientAngle = angle {
        let (startPoint, endPoint) = CGPoint.getStartAndEndPoint(angle: _gradientAngle)
        gradient.startPoint = startPoint
        gradient.endPoint = endPoint
    }
    gradient.mask = areaLayer
    layers.append(gradient)
    self.layer.addSublayer(gradient)

我遇到的问题是渐变实际上从边界的顶部开始,如下所示:

但我希望它只从高数据点开始。但是,如果我更改渐变层的框架以将其向下移动,渐变实际上会像这样向下移动:

请问有什么帮助吗?

【问题讨论】:

    标签: swift cashapelayer cagradientlayer


    【解决方案1】:

    您不希望渐变框架与形状图层的大小相同;您希望与路径的边界框大小相同。幸运的是,cgPath 有一个 boundingBox 方法。

    【讨论】:

    • 谢谢,经过一些小道后,它似乎只将边界和框架设置为边界框工作......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-19
    • 2014-09-28
    • 2021-11-07
    • 1970-01-01
    • 1970-01-01
    • 2016-03-03
    • 1970-01-01
    相关资源
    最近更新 更多