2014-10-29 2 views
2

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

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

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

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

Я нарисовал эти графики с использованием этих link

слегка изменил код и рисования диаграмм, как этот

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

первый я звоню guagegraph (подкласс UIView) от моего ViewController

percentageArray содержит процент каждого Guage

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]; 
} 

затем вызвать класс percentLayer (подкласс 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 метод для рисования группы tableviewviewback окрашенного цвета.

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

ответ

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]; 
} 

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

EDIT

ПЕРВЫЙ позволяет сделать ваши 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); 

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

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

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

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, и я могу дать ему шанс ,

+0

Я не получил u ..... пришел снова PLS @Fabian Buentello – sreekanthk

+0

ну это звучит как '[guageGraph setPercent: [percentArray [i] intValue] withIndex: i];' устанавливает тот же вид и , пока он запускает это 'for loop'. Есть ли только один «просмотр» на странице? или у вас есть 'view' для каждого объекта внутри' percentArray'? –

+0

есть только один вид – sreekanthk