Xcode 在SWIFT中绘制一个圆形线段

Xcode 在SWIFT中绘制一个圆形线段,xcode,swift,uiview,draw,cgcontext,Xcode,Swift,Uiview,Draw,Cgcontext,我想创建一个带有切片的循环进度,其中每个切片都是一个圆弧 我的代码基于以下答案: 但我不知道如何复制和旋转它10次。 我想用一个进度变量(百分比)给它上色 编辑:我想要这样的东西 需要帮忙吗 关于您可以使用循环路径并设置strokeStart和StrokeEnd。大概是这样的: let circlePath = UIBezierPath(ovalInRect: CGRect(x: 200, y: 200, width: 150, height: 150)) var segments: [CA

我想创建一个带有切片的循环进度,其中每个切片都是一个圆弧

我的代码基于以下答案:

但我不知道如何复制和旋转它10次。 我想用一个进度变量(百分比)给它上色

编辑:我想要这样的东西

需要帮忙吗


关于

您可以使用循环路径并设置strokeStart和StrokeEnd。大概是这样的:

let circlePath = UIBezierPath(ovalInRect: CGRect(x: 200, y: 200, width: 150, height: 150))
var segments: [CAShapeLayer] = []
let segmentAngle: CGFloat = (360 * 0.125) / 360

for var i = 0; i < 8; i++ {
    let circleLayer = CAShapeLayer()
    circleLayer.path = circlePath.CGPath

    // start angle is number of segments * the segment angle
    circleLayer.strokeStart = segmentAngle * CGFloat(i)

    // end angle is the start plus one segment, minus a little to make a gap
    // you'll have to play with this value to get it to look right at the size you need
    let gapSize: CGFloat = 0.008
    circleLayer.strokeEnd = circleLayer.strokeStart + segmentAngle - gapSize

    circleLayer.lineWidth = 10
    circleLayer.strokeColor = UIColor(red:0,  green:0.004,  blue:0.549, alpha:1).CGColor
    circleLayer.fillColor = UIColor.clearColor().CGColor

    // add the segment to the segments array and to the view
    segments.insert(circleLayer, atIndex: i)
    view.layer.addSublayer(segments[i])
}
let circlePath=UIBezierPath(ovalInRect:CGRect(x:200,y:200,宽度:150,高度:150))
变量段:[CAShapeLayer]=[]
让节段角度:CGFloat=(360*0.125)/360
对于var i=0;i<8;i++{
设circleLayer=CAShapeLayer()
circleLayer.path=circlePath.CGPath
//起始角度是分段数*分段角度
circleLayer.strokeStart=分段角度*CGFloat(i)
//终点角度是起点加上一段,减去一点以形成间隙
//您必须使用此值才能使其看起来符合您所需的大小
让gapSize:CGFloat=0.008
circleLayer.strokeEnd=circleLayer.strokeStart+分段角度-间隙
circleLayer.lineWidth=10
circleLayer.strokeColor=UIColor(红色:0,绿色:0.004,蓝色:0.549,alpha:1)。CGColor
circleLayer.fillColor=UIColor.clearColor().CGColor
//将线段添加到“线段”阵列和视图中
段.插入(圆形层,索引:i)
view.layer.addSublayer(段[i])
}

您可以使用循环路径并设置strokeStart和StrokeEnd。大概是这样的:

let circlePath = UIBezierPath(ovalInRect: CGRect(x: 200, y: 200, width: 150, height: 150))
var segments: [CAShapeLayer] = []
let segmentAngle: CGFloat = (360 * 0.125) / 360

for var i = 0; i < 8; i++ {
    let circleLayer = CAShapeLayer()
    circleLayer.path = circlePath.CGPath

    // start angle is number of segments * the segment angle
    circleLayer.strokeStart = segmentAngle * CGFloat(i)

    // end angle is the start plus one segment, minus a little to make a gap
    // you'll have to play with this value to get it to look right at the size you need
    let gapSize: CGFloat = 0.008
    circleLayer.strokeEnd = circleLayer.strokeStart + segmentAngle - gapSize

    circleLayer.lineWidth = 10
    circleLayer.strokeColor = UIColor(red:0,  green:0.004,  blue:0.549, alpha:1).CGColor
    circleLayer.fillColor = UIColor.clearColor().CGColor

    // add the segment to the segments array and to the view
    segments.insert(circleLayer, atIndex: i)
    view.layer.addSublayer(segments[i])
}
let circlePath=UIBezierPath(ovalInRect:CGRect(x:200,y:200,宽度:150,高度:150))
变量段:[CAShapeLayer]=[]
让节段角度:CGFloat=(360*0.125)/360
对于var i=0;i<8;i++{
let circleLayer=CAShapeLayer()
circleLayer.path=circlePath.CGPath
//起始角度是分段数*分段角度
circleLayer.strokeStart=分段角度*CGFloat(i)
//终点角度是起点加上一段,减去一点以形成间隙
//您必须使用此值才能使其看起来符合您所需的大小
让gapSize:CGFloat=0.008
circleLayer.strokeEnd=circleLayer.strokeStart+分段角度-间隙
circleLayer.lineWidth=10
circleLayer.strokeColor=UIColor(红色:0,绿色:0.004,蓝色:0.549,alpha:1)。CGColor
circleLayer.fillColor=UIColor.clearColor().CGColor
//将线段添加到“线段”阵列和视图中
段.插入(圆形层,索引:i)
view.layer.addSublayer(段[i])
}

您看过本教程吗?对但我真的不想这样做。我想要这样的东西:看看这个:你看过这个教程吗?对但我真的不想这样做。我想要这样的东西:看看这个:太好了!!谢谢还有一件事,你怎么能从一个进度率(0%到100%)给分段上色呢?从灰色到蓝色。谢谢你的帮助!!我只需要使用步骤数来修改基础颜色。在循环中应该是干净的,因为你已经通过了每个部分。太棒了!!它起作用了。只需旋转层,因为第一段从-M_PI开始,而不是-M_PI/2关于旋转不起作用的另一个问题:我在for循环外创建了一个新的CAShapeLayer,并进行了此转换:var transform:catTransferorM3D=catTransferorM3DidEntity testlayer.anchorPoint=CGPoint(x:0.5,y:0.5)transform=catTransform3drotate(transform,degree2radian(CGFloat(-90)),0,0,1)testlayer.transform=transform view.layer.addSublayer(testlayer),但结果不好。为什么?我忘了说:var testlayer=CAShapeLayer()testlayer.frame=CGRect(x:self.view.frame.midX,y:30,宽:200,高:200)太棒了!!谢谢还有一件事,你怎么能从一个进度率(0%到100%)给分段上色呢?从灰色到蓝色。谢谢你的帮助!!我只需要使用步骤数来修改基础颜色。在循环中应该是干净的,因为你已经通过了每个部分。太棒了!!它起作用了。只需旋转层,因为第一段从-M_PI开始,而不是-M_PI/2关于旋转不起作用的另一个问题:我在for循环外创建了一个新的CAShapeLayer,并进行了此转换:var transform:catTransferorM3D=catTransferorM3DidEntity testlayer.anchorPoint=CGPoint(x:0.5,y:0.5)transform=catTransform3drotate(transform,degree2radian(CGFloat(-90)),0,0,1)testlayer.transform=transform view.layer.addSublayer(testlayer),但结果不好。为什么?我忘了说:var testlayer=CAShapeLayer()testlayer.frame=CGRect(x:self.view.frame.midX,y:30,宽:200,高:200)