Описание: диаграмма строится по параметрам, заданным с помощью меню.
#import "DataSource.h"
#import "Menu.h"
#import <Charting/ChartTouchesDelegate.h>
#import <Charting/Chart.h>
#import <Charting/ColumnSeries.h>
#import <Charting/AreaSeries.h>
#import <Charting/BarSeries.h>
#import <Charting/PieSeries.h>
#import <Charting/LineSeries.h>
#import <Charting/LinePoint.h>
#import <Charting/ChartTouchesDelegate.h>
#import <Charting/ChartLabel.h>
typedef enum
{
kColumnAbsolute,
kColumnAdditional,
kColumnPercent,
kBarAbsolute,
kBarAdditional,
kBarPercent,
kLineAbsolute,
kLineAdditional,
kLinePercent,
kAreaAbsolute,
kAreaAdditional,
kAreaPercent,
kPie,
kDoughnut,
} ChartType;
@interface ViewController : UIViewController<ChartTouchesDelegate,SelectedCellAction> {
Chart *chart;
float max;
float min;
NSMutableDictionary *m_numberFormat;
int axisType;
BOOL hideAxis;
int chartType;
NSArray *m_colors;
DataSource *datasource;
Menu *menu;
}
- (ChartLabel *)createDefaultLabel;
- (void) setChartSettings;
- (ChartSeries *)createSeriesWithType:(ChartType)type;
- (void) drawAllSeries;
@end
#import "ViewController.h"
#define ColorWithRGBA(_r, _g, _b, _a) \
[UIColor colorWithRed:(_r) / 255.0f green:(_g) / 255.0f blue:(_b) / 255.0f alpha:(_a) / 255.0f]
@implementation ViewController
- (void)dealloc
{
[super dealloc];
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
}
#pragma mark - View lifecycle
- (void)viewDidLoad
{
[super viewDidLoad];
chartType = 0;
menu = [[Menu alloc] init];
menu.delegate = self;
m_numberFormat = [[NSMutableDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithBool:NO], @"asInSource",
[NSNumber numberWithInt:2], @"decNumbers",
[NSNumber numberWithBool:YES], @"separator",
@"", @"prefix",
@"", @"suffix",
[NSNumber numberWithBool:NO], @"negativeRed",
nil] retain];
m_colors = [[NSArray arrayWithObjects:
ColorWithRGBA(19, 88, 138, 255 ),
ColorWithRGBA(109, 167, 192, 255 ),
ColorWithRGBA(41, 171, 226, 255 ),
ColorWithRGBA(0, 169, 157, 255 ),
ColorWithRGBA(103, 124, 139, 255 ),
ColorWithRGBA(221, 241, 250, 255 ),
ColorWithRGBA(169, 221, 243, 255 ),
ColorWithRGBA(102, 203, 196, 255 ),
ColorWithRGBA(208, 222, 232, 255 ),
ColorWithRGBA(190, 160, 186, 255 ),
nil] retain];
// Создаем диаграмму и задаем размеры
chart = [[Chart alloc] initWithName:@"chart"];
chart.frame=CGRectMake(0, 0, 600, 550);
chart.backgroundColor = [UIColor whiteColor];
// Создаем источник данных
datasource = [[DataSource alloc] init];
[self setChartSettings];
[self drawAllSeries];
// Задаем ссылку на источник данных
[chart setDataSource :datasource];
[chart setDelegate:self];
// Задаем для источника данных максимальное и минимальное значение границы по оси Y
[datasource prepare];
[chart forceDataUpdate];
chart.frame = CGRectMake(0, 40, chart.frame.size.width, chart.frame.size.height - 40);
// Отображаем диаграмму
[self.view addSubview:chart];
UIToolbar *toolBar = [[[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, 600, 40)] autorelease];
[self.view addSubview:toolBar];
[toolBar setBarStyle:UIBarStyleDefault];
UIBarButtonItem *showMenuButton = [[[UIBarButtonItem alloc] initWithTitle:@"Тип диаграммы" style:UIBarButtonItemStyleDone target:self action:@selector(showMenu)] autorelease];
toolBar.items = [NSArray arrayWithObjects:showMenuButton, nil];
}
- (void) showMenu
{
[self.view addSubview:menu.view];
}
- (void)drawAllSeries
{
[chart deleteAllSeries];
int seriesCount = datasource.countSeries;
for (int i = 0; i < seriesCount; ++i)
{
ChartSeries *series = [self createSeriesWithType:chartType];
series.dataIndex = i;
UIColor *color = [m_colors objectAtIndex:i % [m_colors count]];
if ([series respondsToSelector:@selector(setColor:)])
{
[(LineSeries *)series setColor:color];
}
else if ([series respondsToSelector:@selector(setBorderColor:)] &&
[series respondsToSelector:@selector(setBackground:)])
{
SolidColorBrush *brush = [[SolidColorBrush new] autorelease];
brush.color = [m_colors objectAtIndex:i % [m_colors count]];
[(AreaSeries *)series setBackground:brush];
}
series.defaultLabel = [self createDefaultLabel];
[chart addSeries:series];
}
[chart forceDataUpdate];
((ValueAxis *)[chart.axes objectForKey:[NSNumber numberWithInt:AxisLineX]]).valueAxisType = axisType;
((ValueAxis *)[chart.axes objectForKey:[NSNumber numberWithInt:AxisLineY]]).valueAxisType = axisType;
((ValueAxis *)[chart.axes objectForKey:[NSNumber numberWithInt:AxisLineX]]).visible = !hideAxis;
((ValueAxis *)[chart.axes objectForKey:[NSNumber numberWithInt:AxisLineY]]).visible = !hideAxis;
}
- (ChartSeries *)createSeriesWithType:(ChartType)type
{
ChartSeries *series = nil;
axisType = ValueAxisAbsolute;
hideAxis = NO;
switch (type)
{
case kColumnAbsolute:
series = [[ColumnSeries new] autorelease];
((ColumnSeries *)series).fillRatio = 0.7;
((ColumnSeries *)series).borderThickness = 0;
break;
case kColumnAdditional:
series = [[ColumnSeries new] autorelease];
((ColumnSeries *)series).fillRatio = 0.7;
((ColumnSeries *)series).borderThickness = 0;
((ColumnSeries *)series).borderRadius = 0.5;
((ColumnSeries *)series).borderColor = [UIColor whiteColor];
axisType = ValueAxisRelative;
break;
case kColumnPercent:
series = [[ColumnSeries new] autorelease];
((ColumnSeries *)series).fillRatio = 0.7;
((ColumnSeries *)series).borderThickness = 0;
axisType = ValueAxisPercent;
break;
case kAreaAbsolute:
series = [[AreaSeries new] autorelease];
((AreaSeries *)series).borderThickness = 1;
((AreaSeries *)series).borderColor = [UIColor whiteColor];
series.alpha = 0.4;
break;
case kAreaAdditional:
series = [[AreaSeries new] autorelease];
((AreaSeries *)series).borderThickness = 0;
axisType = ValueAxisRelative;
series.alpha = 0.4;
break;
case kAreaPercent:
series = [[AreaSeries new] autorelease];
((AreaSeries *)series).borderThickness = 0;
axisType = ValueAxisPercent;
series.alpha = 0.4;
break;
case kLineAbsolute:
series = [[LineSeries new] autorelease];
break;
case kLineAdditional:
series = [[LineSeries new] autorelease];
axisType = ValueAxisRelative;
break;
case kLinePercent:
series = [[LineSeries new] autorelease];
axisType = ValueAxisPercent;
break;
case kBarAbsolute:
series = [[BarSeries new] autorelease];
((ColumnSeries *)series).fillRatio = 0.7;
((BarSeries *)series).borderThickness = 0;
break;
case kBarAdditional:
series = [[BarSeries new] autorelease];
((ColumnSeries *)series).fillRatio = 0.7;
((BarSeries *)series).borderThickness = 0;
axisType = ValueAxisRelative;
break;
case kBarPercent:
series = [[BarSeries new] autorelease];
((ColumnSeries *)series).fillRatio = 0.7;
((BarSeries *)series).borderThickness = 0;
axisType = ValueAxisPercent;
break;
case kPie:
series = [[PieSeries new] autorelease];
((PieSeries *)series).borderThickness = 1;
((PieSeries *)series).borderColor = [UIColor whiteColor];
((PieSeries *)series).cutoutLength = 10;
((PieSeries *)series).radiusPadding = 100;
hideAxis = YES;
break;
case kDoughnut:
series = [[PieSeries new] autorelease];
((PieSeries *)series).borderThickness = 1;
((PieSeries *)series).borderColor = [UIColor whiteColor];
((PieSeries *)series).radiusPadding = 100;
((PieSeries *)series).holeRadius = 0.3;
hideAxis = YES;
break;
}
return series;
}
- (void )viewDidUnload
{
[super viewDidUnload];
}
- (BOOL )shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
return (interfaceOrientation == UIInterfaceOrientationPortrait);
}
- (void )chartTouchesTapInView:(UIView *)v withPoint:(CGPoint)point
{
UIView *sender = [v hitTest:point withEvent:nil];
if ([sender isKindOfClass:[ChartPoint class]])
{
ChartPoint *pt = (ChartPoint *)sender;
if (pt.chartLabel)
{
pt.chartLabelVisible = !pt.chartLabelVisible;
if (pt.chartLabelVisible)
[pt moveAboveAllByZOrder];
else
[pt restoreZOrder];
}
[chart setNeedsLayout];
}
}
- (void)setChartSettings
{
((ValueAxis *)[chart.axes objectForKey:[NSNumber numberWithInt:AxisLineX]]).axisThickness = 1; // Толщина оси X
((ValueAxis *)[chart.axes objectForKey:[NSNumber numberWithInt:AxisLineX]]).majorTicks.thickness = 0; // Толщина основных делений на оси Х
((ValueAxis *)[chart.axes objectForKey:[NSNumber numberWithInt:AxisLineX]]).minorTicks.thickness = 0; // Толщина дополнительных делений на оси Х
((ValueAxis *)[chart.axes objectForKey:[NSNumber numberWithInt:AxisLineY]]).axisThickness = 1; // Толщина оси Y
((ValueAxis *)[chart.axes objectForKey:[NSNumber numberWithInt:AxisLineY]]).majorTicks.thickness = 1;
((ValueAxis *)[chart.axes objectForKey:[NSNumber numberWithInt:AxisLineY]]).majorTicks.size = 3; //Длина делений
((ValueAxis *)[chart.axes objectForKey:[NSNumber numberWithInt:AxisLineY]]).minorTicks.thickness = 0;
((ValueAxis *)[chart.axes objectForKey:[NSNumber numberWithInt:AxisLineY]]).showGrid = YES; // Отображаем сетку
((ValueAxis *)[chart.axes objectForKey:[NSNumber numberWithInt:AxisLineY]]).gridThickness = 1; //Толщина сетки
((ValueAxis *)[chart.axes objectForKey:[NSNumber numberWithInt:AxisLineY]]).gridColor = ColorWithRGBA(200, 200, 200, 255);
((TimeAxis *)[chart.axes objectForKey:[NSNumber numberWithInt:AxisTypeTimeline]]).visible = NO; //Скрываем временную шкалу
Thickness th = {10,0,0,20}; // Отступы
chart.legend.margin = th; // Отступы для легенды
th.bottom = 0;
th.left = th.right = th.top = 10;
chart.chartArea.padding = th; // Отступы для области диаграмм
}
- (ChartLabel *)createDefaultLabel
{
ChartLabel *result = [[[ChartLabel alloc] initWithFrame:CGRectZero] autorelease]; // Создаем метку
result.background = [[SolidColorBrush new] autorelease]; // Задаем цвет
result.borderColor = [UIColor blackColor]; // Цвет границы
result.borderThickness = 1;
result.borderRadius = 10;
result.font = [UIFont fontWithName:@"Arial" size:18]; // Шрифт
result.textAlignment = UITextAlignmentCenter;
result.textColor = [UIColor blackColor];
result.mask = [NSString stringWithFormat:@"%@#FVAL%@",
(NSString *)[m_numberFormat objectForKey:@"prefix"],
(NSString *)[m_numberFormat objectForKey:@"suffix"]];
result.countOfDecimalNumbers = [((NSNumber *)[m_numberFormat objectForKey:@"decNumbers"]) intValue];
result.displayNegativesInRed = [(NSNumber *)[m_numberFormat objectForKey:@"negativeRed"] boolValue];
result.hasHorizontalNoteLine = result.hasVerticalNoteLine = result.hasFootNoteLine = NO;
result.minWidth = 0;
return result;
}
- (void)selectedItemWithIndex:(NSInteger)index
{
chartType = index; // Устанавливаем тип диаграммы, выбранный в меню
[self drawAllSeries]; // Перерисовываем диаграмму
}
@end
См. также: