PieChartViewController.m 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224
  1. //
  2. // PieChartViewController.m
  3. // ChartsDemo
  4. //
  5. // Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda
  6. // A port of MPAndroidChart for iOS
  7. // Licensed under Apache License 2.0
  8. //
  9. // https://github.com/danielgindi/Charts
  10. //
  11. #import "PieChartViewController.h"
  12. #import "ChartsDemo_iOS-Swift.h"
  13. @interface PieChartViewController () <ChartViewDelegate>
  14. @property (nonatomic, strong) IBOutlet PieChartView *chartView;
  15. @property (nonatomic, strong) IBOutlet UISlider *sliderX;
  16. @property (nonatomic, strong) IBOutlet UISlider *sliderY;
  17. @property (nonatomic, strong) IBOutlet UITextField *sliderTextX;
  18. @property (nonatomic, strong) IBOutlet UITextField *sliderTextY;
  19. @end
  20. @implementation PieChartViewController
  21. - (void)viewDidLoad
  22. {
  23. [super viewDidLoad];
  24. self.title = @"Pie Chart";
  25. self.options = @[
  26. @{@"key": @"toggleValues", @"label": @"Toggle Y-Values"},
  27. @{@"key": @"toggleXValues", @"label": @"Toggle X-Values"},
  28. @{@"key": @"togglePercent", @"label": @"Toggle Percent"},
  29. @{@"key": @"toggleHole", @"label": @"Toggle Hole"},
  30. @{@"key": @"toggleIcons", @"label": @"Toggle Icons"},
  31. @{@"key": @"toggleLabelsMinimumAngle", @"label": @"Toggle Labels Minimum Angle"},
  32. @{@"key": @"animateX", @"label": @"Animate X"},
  33. @{@"key": @"animateY", @"label": @"Animate Y"},
  34. @{@"key": @"animateXY", @"label": @"Animate XY"},
  35. @{@"key": @"spin", @"label": @"Spin"},
  36. @{@"key": @"drawCenter", @"label": @"Draw CenterText"},
  37. @{@"key": @"saveToGallery", @"label": @"Save to Camera Roll"},
  38. @{@"key": @"toggleData", @"label": @"Toggle Data"},
  39. ];
  40. [self setupPieChartView:_chartView];
  41. _chartView.delegate = self;
  42. ChartLegend *l = _chartView.legend;
  43. l.horizontalAlignment = ChartLegendHorizontalAlignmentRight;
  44. l.verticalAlignment = ChartLegendVerticalAlignmentTop;
  45. l.orientation = ChartLegendOrientationVertical;
  46. l.drawInside = NO;
  47. l.xEntrySpace = 7.0;
  48. l.yEntrySpace = 0.0;
  49. l.yOffset = 0.0;
  50. // entry label styling
  51. _chartView.entryLabelColor = UIColor.blackColor;
  52. _chartView.entryLabelFont = [UIFont fontWithName:@"HelveticaNeue-Light" size:12.f];
  53. _sliderX.value = 4.0;
  54. _sliderY.value = 100.0;
  55. [self slidersValueChanged:nil];
  56. [_chartView animateWithXAxisDuration:1.4 easingOption:ChartEasingOptionEaseOutBack];
  57. }
  58. - (void)didReceiveMemoryWarning
  59. {
  60. [super didReceiveMemoryWarning];
  61. // Dispose of any resources that can be recreated.
  62. }
  63. - (void)updateChartData
  64. {
  65. if (self.shouldHideData)
  66. {
  67. _chartView.data = nil;
  68. return;
  69. }
  70. [self setDataCount:_sliderX.value range:_sliderY.value];
  71. }
  72. - (void)setDataCount:(int)count range:(double)range
  73. {
  74. double mult = range;
  75. NSMutableArray *values = [[NSMutableArray alloc] init];
  76. for (int i = 0; i < count; i++)
  77. {
  78. [values addObject:[[PieChartDataEntry alloc] initWithValue:(arc4random_uniform(mult) + mult / 5) label:parties[i % parties.count] icon: [UIImage imageNamed:@"icon"]]];
  79. }
  80. PieChartDataSet *dataSet = [[PieChartDataSet alloc] initWithEntries:values label:@"Election Results"];
  81. dataSet.drawIconsEnabled = NO;
  82. dataSet.sliceSpace = 2.0;
  83. dataSet.iconsOffset = CGPointMake(0, 40);
  84. // add a lot of colors
  85. NSMutableArray *colors = [[NSMutableArray alloc] init];
  86. [colors addObjectsFromArray:ChartColorTemplates.vordiplom];
  87. [colors addObjectsFromArray:ChartColorTemplates.joyful];
  88. [colors addObjectsFromArray:ChartColorTemplates.colorful];
  89. [colors addObjectsFromArray:ChartColorTemplates.liberty];
  90. [colors addObjectsFromArray:ChartColorTemplates.pastel];
  91. [colors addObject:[UIColor colorWithRed:51/255.f green:181/255.f blue:229/255.f alpha:1.f]];
  92. dataSet.colors = colors;
  93. PieChartData *data = [[PieChartData alloc] initWithDataSet:dataSet];
  94. NSNumberFormatter *pFormatter = [[NSNumberFormatter alloc] init];
  95. pFormatter.numberStyle = NSNumberFormatterPercentStyle;
  96. pFormatter.maximumFractionDigits = 1;
  97. pFormatter.multiplier = @1.f;
  98. pFormatter.percentSymbol = @" %";
  99. [data setValueFormatter:[[ChartDefaultValueFormatter alloc] initWithFormatter:pFormatter]];
  100. [data setValueFont:[UIFont fontWithName:@"HelveticaNeue-Light" size:11.f]];
  101. [data setValueTextColor:UIColor.blackColor];
  102. _chartView.data = data;
  103. [_chartView highlightValues:nil];
  104. }
  105. - (void)optionTapped:(NSString *)key
  106. {
  107. if ([key isEqualToString:@"toggleXValues"])
  108. {
  109. _chartView.drawEntryLabelsEnabled = !_chartView.drawEntryLabelsEnabled;
  110. [_chartView setNeedsDisplay];
  111. return;
  112. }
  113. if ([key isEqualToString:@"togglePercent"])
  114. {
  115. _chartView.usePercentValuesEnabled = !_chartView.isUsePercentValuesEnabled;
  116. [_chartView setNeedsDisplay];
  117. return;
  118. }
  119. if ([key isEqualToString:@"toggleHole"])
  120. {
  121. _chartView.drawHoleEnabled = !_chartView.isDrawHoleEnabled;
  122. [_chartView setNeedsDisplay];
  123. return;
  124. }
  125. if ([key isEqualToString:@"toggleLabelsMinimumAngle"])
  126. {
  127. CGFloat newMinimum = _chartView.sliceTextDrawingThreshold == 20.0 ? 0.0 : 20.0;
  128. _chartView.sliceTextDrawingThreshold = newMinimum;
  129. }
  130. if ([key isEqualToString:@"drawCenter"])
  131. {
  132. _chartView.drawCenterTextEnabled = !_chartView.isDrawCenterTextEnabled;
  133. [_chartView setNeedsDisplay];
  134. return;
  135. }
  136. if ([key isEqualToString:@"animateX"])
  137. {
  138. [_chartView animateWithXAxisDuration:1.4];
  139. return;
  140. }
  141. if ([key isEqualToString:@"animateY"])
  142. {
  143. [_chartView animateWithYAxisDuration:1.4];
  144. return;
  145. }
  146. if ([key isEqualToString:@"animateXY"])
  147. {
  148. [_chartView animateWithXAxisDuration:1.4 yAxisDuration:1.4];
  149. return;
  150. }
  151. if ([key isEqualToString:@"spin"])
  152. {
  153. [_chartView spinWithDuration:2.0 fromAngle:_chartView.rotationAngle toAngle:_chartView.rotationAngle + 360.f easingOption:ChartEasingOptionEaseInCubic];
  154. return;
  155. }
  156. [super handleOption:key forChartView:_chartView];
  157. }
  158. #pragma mark - Actions
  159. - (IBAction)slidersValueChanged:(id)sender
  160. {
  161. _sliderTextX.text = [@((int)_sliderX.value) stringValue];
  162. _sliderTextY.text = [@((int)_sliderY.value) stringValue];
  163. [self updateChartData];
  164. }
  165. #pragma mark - ChartViewDelegate
  166. - (void)chartValueSelected:(ChartViewBase * __nonnull)chartView entry:(ChartDataEntry * __nonnull)entry highlight:(ChartHighlight * __nonnull)highlight
  167. {
  168. NSLog(@"chartValueSelected");
  169. }
  170. - (void)chartValueNothingSelected:(ChartViewBase * __nonnull)chartView
  171. {
  172. NSLog(@"chartValueNothingSelected");
  173. }
  174. @end