Ios 斯威夫特:为什么使用现金支付;s从中心绘制的笔划和线宽

Ios 斯威夫特:为什么使用现金支付;s从中心绘制的笔划和线宽,ios,swift,uiview,pie-chart,cashapelayer,Ios,Swift,Uiview,Pie Chart,Cashapelayer,我正在尝试使用具有动态数据的PieChart 单击每个饼图,它必须高亮显示,其余部分处于正常状态 动态更改CAShapeLayer的lineWidth,但lineWidth从中间路径开始增加 它必须从下到上增加 代码: let centerPoint = CGPoint (x: circle.bounds.width / 2, y: circle.bounds.width / 2) let circleRadius : CGFloat = circle.bounds.width

我正在尝试使用具有动态数据的
PieChart

单击每个
饼图
,它必须高亮显示,其余部分处于正常状态

动态更改
CAShapeLayer
lineWidth
,但
lineWidth
从中间路径开始增加

它必须从下到上增加

代码:

    let centerPoint = CGPoint (x: circle.bounds.width / 2, y: circle.bounds.width / 2)
    let circleRadius : CGFloat = circle.bounds.width / 2 * 0.83

    let circlePath = UIBezierPath(arcCenter: centerPoint, radius: circleRadius, startAngle: CGFloat(1.0 * .pi), endAngle: CGFloat(3.0 * .pi), clockwise: true)
    let progressCircle = CAShapeLayer()
    progressCircle.path = circlePath.cgPath
    progressCircle.strokeColor = color.cgColor
    progressCircle.fillColor = UIColor.clear.cgColor

    if onClick == 2 {
        progressCircle.lineWidth = 60
    } else {
        progressCircle.lineWidth = 30
    }
    
    
    progressCircle.strokeStart = strokeStart/PieChartConstant.maxPercent
    progressCircle.lineCap = CAShapeLayerLineCap.butt
    progressCircle.strokeEnd = strokeEnd/PieChartConstant.maxPercent
    .........
    .....
    let centerPoint = CGPoint (x: circle.bounds.width / 2, y: circle.bounds.width / 2)
    var circleRadius : CGFloat = circle.bounds.width / 2 * 0.83

    if onClick == 2 { //THIS BLOCK IS USED TO INCREASE PARTICULAR PIE
        circleRadius = circleRadius + 10
    }

    let circlePath = UIBezierPath(arcCenter: centerPoint, radius: circleRadius, startAngle: CGFloat(1.0 * .pi), endAngle: CGFloat(3.0 * .pi), clockwise: true)
    .......
    ............
查询:

    let centerPoint = CGPoint (x: circle.bounds.width / 2, y: circle.bounds.width / 2)
    let circleRadius : CGFloat = circle.bounds.width / 2 * 0.83

    let circlePath = UIBezierPath(arcCenter: centerPoint, radius: circleRadius, startAngle: CGFloat(1.0 * .pi), endAngle: CGFloat(3.0 * .pi), clockwise: true)
    let progressCircle = CAShapeLayer()
    progressCircle.path = circlePath.cgPath
    progressCircle.strokeColor = color.cgColor
    progressCircle.fillColor = UIColor.clear.cgColor

    if onClick == 2 {
        progressCircle.lineWidth = 60
    } else {
        progressCircle.lineWidth = 30
    }
    
    
    progressCircle.strokeStart = strokeStart/PieChartConstant.maxPercent
    progressCircle.lineCap = CAShapeLayerLineCap.butt
    progressCircle.strokeEnd = strokeEnd/PieChartConstant.maxPercent
    .........
    .....
    let centerPoint = CGPoint (x: circle.bounds.width / 2, y: circle.bounds.width / 2)
    var circleRadius : CGFloat = circle.bounds.width / 2 * 0.83

    if onClick == 2 { //THIS BLOCK IS USED TO INCREASE PARTICULAR PIE
        circleRadius = circleRadius + 10
    }

    let circlePath = UIBezierPath(arcCenter: centerPoint, radius: circleRadius, startAngle: CGFloat(1.0 * .pi), endAngle: CGFloat(3.0 * .pi), clockwise: true)
    .......
    ............
增加的
Pie
应与之前的
Pie
在同一轨道上。请指导我,如何做到这一点

参考:

    let centerPoint = CGPoint (x: circle.bounds.width / 2, y: circle.bounds.width / 2)
    let circleRadius : CGFloat = circle.bounds.width / 2 * 0.83

    let circlePath = UIBezierPath(arcCenter: centerPoint, radius: circleRadius, startAngle: CGFloat(1.0 * .pi), endAngle: CGFloat(3.0 * .pi), clockwise: true)
    let progressCircle = CAShapeLayer()
    progressCircle.path = circlePath.cgPath
    progressCircle.strokeColor = color.cgColor
    progressCircle.fillColor = UIColor.clear.cgColor

    if onClick == 2 {
        progressCircle.lineWidth = 60
    } else {
        progressCircle.lineWidth = 30
    }
    
    
    progressCircle.strokeStart = strokeStart/PieChartConstant.maxPercent
    progressCircle.lineCap = CAShapeLayerLineCap.butt
    progressCircle.strokeEnd = strokeEnd/PieChartConstant.maxPercent
    .........
    .....
    let centerPoint = CGPoint (x: circle.bounds.width / 2, y: circle.bounds.width / 2)
    var circleRadius : CGFloat = circle.bounds.width / 2 * 0.83

    if onClick == 2 { //THIS BLOCK IS USED TO INCREASE PARTICULAR PIE
        circleRadius = circleRadius + 10
    }

    let circlePath = UIBezierPath(arcCenter: centerPoint, radius: circleRadius, startAngle: CGFloat(1.0 * .pi), endAngle: CGFloat(3.0 * .pi), clockwise: true)
    .......
    ............
,但无法实现,也不知道如何实现

我的输出:

    let centerPoint = CGPoint (x: circle.bounds.width / 2, y: circle.bounds.width / 2)
    let circleRadius : CGFloat = circle.bounds.width / 2 * 0.83

    let circlePath = UIBezierPath(arcCenter: centerPoint, radius: circleRadius, startAngle: CGFloat(1.0 * .pi), endAngle: CGFloat(3.0 * .pi), clockwise: true)
    let progressCircle = CAShapeLayer()
    progressCircle.path = circlePath.cgPath
    progressCircle.strokeColor = color.cgColor
    progressCircle.fillColor = UIColor.clear.cgColor

    if onClick == 2 {
        progressCircle.lineWidth = 60
    } else {
        progressCircle.lineWidth = 30
    }
    
    
    progressCircle.strokeStart = strokeStart/PieChartConstant.maxPercent
    progressCircle.lineCap = CAShapeLayerLineCap.butt
    progressCircle.strokeEnd = strokeEnd/PieChartConstant.maxPercent
    .........
    .....
    let centerPoint = CGPoint (x: circle.bounds.width / 2, y: circle.bounds.width / 2)
    var circleRadius : CGFloat = circle.bounds.width / 2 * 0.83

    if onClick == 2 { //THIS BLOCK IS USED TO INCREASE PARTICULAR PIE
        circleRadius = circleRadius + 10
    }

    let circlePath = UIBezierPath(arcCenter: centerPoint, radius: circleRadius, startAngle: CGFloat(1.0 * .pi), endAngle: CGFloat(3.0 * .pi), clockwise: true)
    .......
    ............

我已经试着达到这个结果

单击后,需要增加此
半径
。然后,得到了准确的结果

代码:

    let centerPoint = CGPoint (x: circle.bounds.width / 2, y: circle.bounds.width / 2)
    let circleRadius : CGFloat = circle.bounds.width / 2 * 0.83

    let circlePath = UIBezierPath(arcCenter: centerPoint, radius: circleRadius, startAngle: CGFloat(1.0 * .pi), endAngle: CGFloat(3.0 * .pi), clockwise: true)
    let progressCircle = CAShapeLayer()
    progressCircle.path = circlePath.cgPath
    progressCircle.strokeColor = color.cgColor
    progressCircle.fillColor = UIColor.clear.cgColor

    if onClick == 2 {
        progressCircle.lineWidth = 60
    } else {
        progressCircle.lineWidth = 30
    }
    
    
    progressCircle.strokeStart = strokeStart/PieChartConstant.maxPercent
    progressCircle.lineCap = CAShapeLayerLineCap.butt
    progressCircle.strokeEnd = strokeEnd/PieChartConstant.maxPercent
    .........
    .....
    let centerPoint = CGPoint (x: circle.bounds.width / 2, y: circle.bounds.width / 2)
    var circleRadius : CGFloat = circle.bounds.width / 2 * 0.83

    if onClick == 2 { //THIS BLOCK IS USED TO INCREASE PARTICULAR PIE
        circleRadius = circleRadius + 10
    }

    let circlePath = UIBezierPath(arcCenter: centerPoint, radius: circleRadius, startAngle: CGFloat(1.0 * .pi), endAngle: CGFloat(3.0 * .pi), clockwise: true)
    .......
    ............
输出


我个人认为,绘制整个分段形状并填充它,而不是试图让一个笔划代表形状,你会更高兴。我毫不费力地得到了这种东西:


这里的每一段都画成一条弧,一条线,一条弧,一条线,然后填充。这种方法可以完全控制分段的绘制方式,因为我们是自己绘制分段的。

问题是什么?嗨@matt,增加的饼图应该和以前的饼图一样在同一条轨道上。,如何做到这一点?我不知道你所说的“同一轨道”是什么意思。你能展示一张你希望它们看起来像什么的图片吗?@Sweeper Image updated.,突出显示的饼图应该和“REQUIRED”Image一样位于同一路径中。看起来,REQUIRED Image中的所有线宽都是相同的。首先,为什么要有条件地将
线宽设置为不同的值?您应该将所有线宽设置为相同的数字。这仍然不是解决问题的可行或可维护的方法。您的图形与原始目标图形(中右侧的图形)不相似,也不会相似。与其破坏设计以匹配您的代码,不如升级您的代码以实现设计。我的真实设计不能发布在这里,这是机密。我只是想知道为什么笔划是从中间画出来的,有没有办法把馅饼移到同一个轨道上。我前面提到的设计[你在前面的评论中提到过],代表“同一轨道”的含义。而且,我不想去图书馆。我在试着自己。所以我在这里问了一个问题。但我不知道为什么要投否决票。谢谢@matt,这段简单的代码将帮助很多追随者实现这种简单的饼图。是的@matt。我画了一个完整的圆圈,然后我试图调整笔划的开始和结束。这种做法是错误的。我们必须画出精确的弧线,然后根据需要填充或使用笔划。我已经搜索了很多,完成了我的要求。谢谢你的评论。“如果目标是一个饼状图,画一个饼状图,然后填充它”——在这句话的帮助下,我已经完成了。