CAShapeLayer随机填充颜色

时间:2016-01-31 07:47:38

标签: ios objective-c pie-chart uibezierpath cashapelayer

所以我有一个使用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];
}

}

1 个答案:

答案 0 :(得分:0)

我明白了。我接受了通过我的colorArray的循环。我为索引(i)处的对象分配了一个“UIColor * color”变量,它与我的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];
}

}