带线性渐变的饼图-swift

带线性渐变的饼图-swift,swift,core-graphics,pie-chart,linear-gradients,Swift,Core Graphics,Pie Chart,Linear Gradients,我知道这个问题已经出现好几次了。我试图实现我的案件的所有答案,但我仍然不知道如何做到这一点 我有一种饼图,我想为每一段创建渐变,例如,中间的绿色和远离中心的红色或其他任何东西。。。。但我要么面对一个占据整个屏幕的渐变——看起来我不明白剪裁上下文是如何工作的,要么我什么都看不到 override func draw(_ rect: CGRect) { let centerX = (bounds.size.width)/2 let centerY = (bou

我知道这个问题已经出现好几次了。我试图实现我的案件的所有答案,但我仍然不知道如何做到这一点

我有一种饼图,我想为每一段创建渐变,例如,中间的绿色和远离中心的红色或其他任何东西。。。。但我要么面对一个占据整个屏幕的渐变——看起来我不明白剪裁上下文是如何工作的,要么我什么都看不到

override func draw(_ rect: CGRect)
    {
        let centerX = (bounds.size.width)/2
        let centerY = (bounds.size.height)/2
        let center = CGPoint(x: centerX, y: centerY)
        let radius: (CGFloat) = min(centerX/2, centerY/2)
        let context = UIGraphicsGetCurrentContext()

        // A method where I configure labels
        func label(text: String, value: CGFloat, angle: CGFloat, color: UIColor) {

            let labX = centerX + cos(angle) * newValue * 1.2
            let labY = centerY + sin(angle) * newValue * 1.2
            let myLabel = UILabel(frame: CGRect(x: labX, y: labY, width: 80, height: 40))

            ...
            addSubview(myLabel)
        }

        // Configure arc -> where I try to add gradients to my segments
        func arc(radius: CGFloat, startAngle: CGFloat, endAngle: CGFloat) {

            var finalRadius: CGFloat = radius
            if radius == -1 {
                finalRadius = 100
                phenotypeColor = UIColor.init(red: 159/255.0, green: 193/255.0, blue: 204/255.0, alpha: 0.5)
            }
            else {
                phenotypeColor = UIColor.orange
            }

            context?.setFillColor(phenotypeColor.cgColor)
            context?.move(to: center)
            context?.addArc(center: center, radius: finalRadius, startAngle: startAngle, endAngle: edAngle, clockwise: true)
            context?.fillPath()

            // I would like to implement here a gradient layer to the newly-created arc. I tried o add a CAGradientLayer but I cannot apply it to the segment area...
        }

        // One arc
        label(text: ..., value: ..., angle: ..., color: ...)
        arc(radius: ..., startAngle: ..., endAngle: ...)

        //Another arc
        ...


    }
如果有人能帮我

这只是我没有任何渐变的图像:

编辑: 我试图在下面添加这些行,但没有成功

    let path = UIBezierPath(arcCenter: center, radius: finalRadius, startAngle: myStartAngle, endAngle: myEndAngle, clockwise: true)
    let RectView = path.bounds
    let myView = UIView.init(frame: RectView)
    let gradientLayer = CAGradientLayer()
    gradientLayer.frame = myView.bounds
    gradientLayer.colors = [UIColor.red, UIColor.blue]
    myView.layer.addSublayer(gradientLayer)

有人能告诉我如何从路径获取UIView吗?

这里需要的是CAGradientLayer

let gradientLayer = CAGradientLayer()
gradientLayer.frame = myView.bounds
gradientLayer.colors = [UIColor.red, UIColor.blue]
myView.layer.addSublayer(gradientLayer)
其中myView是具有饼图段的视图


如果您有任何进一步的问题,请告诉我,我希望您能让它正常工作-看起来很酷:

我认为您缺少.cg扩展。gradientlayer颜色数组的颜色应为cgColors而不是UiColors

let path = UIBezierPath(arcCenter: center, radius: finalRadius, startAngle: myStartAngle, endAngle: myEndAngle, clockwise: true)
let RectView = path.bounds
let myView = UIView.init(frame: RectView)
let gradientLayer = CAGradientLayer()
gradientLayer.frame = myView.bounds
gradientLayer.colors = [UIColor.red.cgColor, UIColor.blue.cgColor]
myView.layer.addSublayer(gradientLayer)

谢谢回复!这或多或少是我以前尝试过的,但我不确定如何才能使我的视图成为一个片段的视图。我想这可能需要用到clipping上下文函数或其他任何东西,但我无法成功地完成它,因为我使用了.move、.addArc和.fillPath方法。