Рисование нескольких графиков Guage одновременно с использованием Coregraphics

Я работаю над графиками, используя только CORE GRAPHICS. Я успешно выполнил рисование линейных диаграмм, гистограмм и одиночной диаграммы.

Теперь мое требование Мое требование

Но когда я рисую в контексте, и я получаю только один график, как это

Что я имеюЯ взял проценты графиков в массиве и с помощью for цикл, я рисовал все проценты в массиве, но конечный результат, который я получаю, - это только одна диаграмма, которая является последним объектом в массиве.

Я нарисовал эти графики, используя эти ссылки

немного поменял код и рисовал графики вот так

код, который я использую, чтобы нарисовать диаграмму

Сначала я называю Guagegraph (подкласс UIView) из моего Viewcontroller

процент Array содержит проценты каждого гаджета

percentageArray = [[NSArray alloc] initWithObjects:@"80", @"76", @"92", @"49", nil];
for (int i = 0; i < percentageArray.count; i++)
    {
        [guageGraph setPercent:[percentageArray[i] intValue] withIndex:i];
    }

тогда в guagegraph ниже метод

- (void)setPercent:(int)percent withIndex:(int)i
{
CGFloat floatPercent = percent / 100.0;
floatPercent = MIN(1, MAX(0, floatPercent));
percentLayer.percent = floatPercent;
percentLayer.i = i;
[self setNeedsLayout];
[percentLayer setNeedsDisplay];
}

затем вызывая класс процентов Layer (подкласс CALayer) и рисование контекста

-(void)drawInContext:(CGContextRef)ctx
{
[self DrawRight:ctx];
[self DrawLeft:ctx];

}
-(void)DrawRight:(CGContextRef)ctx
{
CGPoint center = CGPointMake(self.frame.size.width / 2, 160);

CGFloat delta = -toRadians(270 * percent);


CGContextSetFillColorWithColor(ctx, [UIColor orangeColor].CGColor);

CGContextSetLineWidth(ctx, 1);

CGContextSetLineCap(ctx, kCGLineCapRound);

CGContextSetAllowsAntialiasing(ctx, YES);

CGMutablePathRef path = CGPathCreateMutable();

CGPathAddRelativeArc(path, NULL, center.x, center.y, 135 - 5 - (15 * i), (3 * M_PI / 4), -delta);
CGPathAddRelativeArc(path, NULL, center.x, center.y, 150 - 5 - (15 * i), (3 * M_PI / 4) - delta, delta);
CGPathAddLineToPoint(path, NULL, center.x, center.y);

CGContextAddPath(ctx, path);
CGContextFillPath(ctx);
}

-(void)DrawLeft:(CGContextRef)ctx
{
CGPoint center = CGPointMake(self.frame.size.width / 2, 160);
CGFloat delta = toRadians(270 * (1 - percent));


CGContextSetFillColorWithColor(ctx, [UIColor groupTableViewBackgroundColor].CGColor);

CGContextSetLineWidth(ctx, 1);

CGContextSetLineCap(ctx, kCGLineCapRound);

CGContextSetAllowsAntialiasing(ctx, YES);

CGMutablePathRef path = CGPathCreateMutable();

CGPathAddRelativeArc(path, NULL, center.x, center.y, 135 - 5 - (15 * i), (M_PI / 4), -delta);
CGPathAddRelativeArc(path, NULL, center.x, center.y, 150 - 5 - (15 * i), (M_PI / 4) - delta, delta);
CGPathAddLineToPoint(path, NULL, center.x, center.y);

CGContextAddPath(ctx, path);
CGContextFillPath(ctx);
}

drawRight Метод состоит в том, чтобы нарисовать оранжевый и draw left метод для рисования цветной таблицы.

Когда начинается цикл, рисуется первый процентный график, а когда начинается второй цикл, первый нарисованный график заменяется текущим процентом цикла, а второй график рисуется, как, например, последний график отображается только

Любая помощь приветствуется.

1 ответ

Я считаю, что ваша проблема лежит здесь ->

 percentageArray = [[NSArray alloc] initWithObjects:@"80", @"76", @"92", @"49", nil];
 for (int i = 0; i < percentageArray.count; i++)
{
    [guageGraph setPercent:[percentageArray[i] intValue] withIndex:i];
}

Я чувствую, что вы должны вместо этого добавлять их в массив. и отображать их, как только все объекты были нарисованы.

РЕДАКТИРОВАТЬ

ПЕРВЫЙ позволяет сделать ваш precentLayer Класс отображения разных цветовых шкал. так что добавьте этот кусок кода в -(void)drawRight

CGFloat hue = ( arc4random() % 256 / 256.0 );  //  0.0 to 1.0
CGFloat saturation = ( arc4random() % 128 / 256.0 ) + 0.5;  //  0.5 to 1.0, away from white
CGFloat brightness = ( arc4random() % 128 / 256.0 ) + 0.5;  //  0.5 to 1.0, away from black
UIColor *randomColor = [UIColor colorWithHue:hue saturation:saturation brightness:brightness alpha:1];

//update this line
CGContextSetFillColorWithColor(ctx, randomColor.CGColor);

И посмотрите, возможно, они просто перекрывают друг друга, если это не так...

================================================== ==========================

ПОТОМ, так как есть только один вид, попробуйте что-то вроде этого.

percentageArray = [[NSArray alloc] initWithObjects:@"80", @"76", @"92", @"49", nil];

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

    UIView *percentGauge =[self setPercent:[percentageArray[i] intValue] withIndex:i];

    //make background clear so we can see the guage behind it
    percentGauge.backgroundColor = [UIColor clearColor];
}

и сделать -(void)setPercent: withIndex: вернуть UIView так....

- (UIView *)setPercent:(int)percent withIndex:(int)i {
    CGFloat floatPercent = percent / 100.0;
    floatPercent = MIN(1, MAX(0, floatPercent));
    percentLayer.percent = floatPercent;
    percentLayer.i = i;
    [self setNeedsLayout];
    [percentLayer setNeedsDisplay];


    return self;
}

если это не поможет, вы можете загрузить файлы, которые вы используете, в dropbox, и я могу попробовать.

Другие вопросы по тегам