CAShapeLayer 随机填充颜色

CAShapeLayer Random Fill Color

所以我有一个饼图 chart/color 轮子,是我使用 CAShapeLayer 和 UIBezierPath 制作的。轮子最多可以有 8 个部分。我需要它,所以每个部分都是不同的颜色。我已经尝试设置一个具有不同颜色的数组 (colorsArray) 并插入到 CAShapeLayer 的 fillColor 方法中,但它只采用 colorsArray 中的最后一种颜色。有没有办法确保创建的每个图层部分都有不同的颜色?我现在有点迷路了。下面是我的代码。提前致谢。

 -(void) drawWheel {

CGPoint circleCenter = CGPointMake(self.bounds.size.width / 2, self.bounds.size.height / 2);

//1 Create a view that we’ll put everything else inside.
container = [[UIView alloc] initWithFrame:self.frame];
container.backgroundColor = [UIColor whiteColor];
container.layer.cornerRadius = 100.0;
container.layer.borderColor = [UIColor blackColor].CGColor;
container.layer.borderWidth = 1.0;

CGFloat angleSize = 2*M_PI/numberOfSections;

for (int i = 0; i < numberOfSections; i++) {

    CAShapeLayer *slice = [CAShapeLayer layer];
    *************************************************
    UIColor * color = [UIColor blueColor];

    //THIS MAKES THE WHOLE THING One Color - the last color in the colorsArray

    for (int i = 0; i < self.colorsArray.count; i++) {

        color = [self.colorsArray objectAtIndex:i];
        slice.fillColor = (__bridge CGColorRef)(color);
    }

    *************************************************

    slice.strokeColor = [UIColor whiteColor].CGColor;
    slice.lineWidth = 3.0;

    CGPoint center = CGPointMake(100.0, 100.0);
    CGFloat radius = 100.0;
    CGFloat startAngle = angleSize * i;

    UIBezierPath *piePath = [UIBezierPath bezierPath];
    [piePath moveToPoint:center];
    [piePath addLineToPoint:circleCenter];
    [piePath addArcWithCenter:center radius:radius startAngle:startAngle endAngle:startAngle + angleSize clockwise:YES];

    [piePath closePath]; // this will automatically add a straight line to the center
    slice.path = piePath.CGPath;
    int i = 0;
    i++;

    [container.layer addSublayer:slice];
}

//7 Adds the container to the main control.
container.userInteractionEnabled = NO;
[self addSubview:container];

//8 Initialize sectors
sectors = [NSMutableArray arrayWithCapacity:numberOfSections];
if (numberOfSections % 2 == 0) {
    [self buildSectorsEven];
} else {
    [self buildSectorsOdd];
}

}

我明白了。我采用了通过我的 colorArray 的循环。我将变量 "UIColor *color" 分配给索引 (i) 处的对象,该对象与我的 for 循环中的部分数相匹配 "color = [self.colorsArray objectAtIndex:i];" 然后我将变量颜色分配给切片的 fillColor。

片段:

for (int i = 0; i < numberOfSections; i++) {

CAShapeLayer *slice = [CAShapeLayer layer];

UIColor *color;
color = [self.colorsArray objectAtIndex:i];
slice.fillColor = [UIColor colorWithCGColor:(__bridge CGColorRef _Nonnull)(color)].CGColor;

完整代码:

-(void) drawWheel {

CGPoint circleCenter = CGPointMake(self.bounds.size.width / 2, self.bounds.size.height / 2);

//1 Create a view that we’ll put everything else inside.
container = [[UIView alloc] initWithFrame:self.frame];
container.backgroundColor = [UIColor whiteColor];
container.layer.cornerRadius = 100.0;
container.layer.borderColor = [UIColor blackColor].CGColor;
container.layer.borderWidth = 1.0;

CGFloat angleSize = 2*M_PI/numberOfSections;

for (int i = 0; i < numberOfSections; i++) {

    CAShapeLayer *slice = [CAShapeLayer layer];

    UIColor *color;
    color = [self.colorsArray objectAtIndex:i];

    slice.strokeColor = [UIColor whiteColor].CGColor;
    slice.lineWidth = 3.0;
    slice.fillColor = [UIColor colorWithCGColor:(__bridge CGColorRef _Nonnull)(color)].CGColor;
    CGPoint center = CGPointMake(100.0, 100.0);
    CGFloat radius = 100.0;
    CGFloat startAngle = angleSize * i;

    UIBezierPath *piePath = [UIBezierPath bezierPath];
    [piePath moveToPoint:center];
    [piePath addLineToPoint:circleCenter];
    [piePath addArcWithCenter:center radius:radius startAngle:startAngle endAngle:startAngle + angleSize clockwise:YES];
    [piePath closePath]; // this will automatically add a straight line to the center
    slice.path = piePath.CGPath;

    [container.layer addSublayer:slice];

}

//7 Adds the container to the main control.
container.userInteractionEnabled = NO;
[self addSubview:container];

//8 Initialize sectors
sectors = [NSMutableArray arrayWithCapacity:numberOfSections];
if (numberOfSections % 2 == 0) {
    [self buildSectorsEven];
} else {
    [self buildSectorsOdd];
}

}