带线性渐变的饼图-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方法。