Merge pull request #31 from Np2x/master
fixed #29, #24 & #23
Showing
3 changed files
with
65 additions
and
40 deletions
| @@ -11,6 +11,8 @@ | @@ -11,6 +11,8 @@ | ||
| 11 | #import "PNChart.h" | 11 | #import "PNChart.h" |
| 12 | #import "PNColor.h" | 12 | #import "PNColor.h" |
| 13 | #import "PNLineChart.h" | 13 | #import "PNLineChart.h" |
| 14 | +#import "PNLineChartData.h" | ||
| 15 | +#import "PNLineChartDataItem.h" | ||
| 14 | #import "PNBarChart.h" | 16 | #import "PNBarChart.h" |
| 15 | #import "PNCircleChart.h" | 17 | #import "PNCircleChart.h" |
| 16 | #import "PNChartDelegate.h" | 18 | #import "PNChartDelegate.h" |
| @@ -11,9 +11,8 @@ | @@ -11,9 +11,8 @@ | ||
| 11 | #import <QuartzCore/QuartzCore.h> | 11 | #import <QuartzCore/QuartzCore.h> |
| 12 | #import "PNChartDelegate.h" | 12 | #import "PNChartDelegate.h" |
| 13 | 13 | ||
| 14 | -#define chartMargin 10 | 14 | + |
| 15 | -#define yLabelMargin 15 | 15 | + |
| 16 | -#define yLabelHeight 11 | ||
| 17 | 16 | ||
| 18 | @interface PNLineChart : UIView | 17 | @interface PNLineChart : UIView |
| 19 | 18 | ||
| @@ -30,19 +29,29 @@ | @@ -30,19 +29,29 @@ | ||
| 30 | @property (strong, nonatomic) NSArray * yLabels; | 29 | @property (strong, nonatomic) NSArray * yLabels; |
| 31 | 30 | ||
| 32 | /** | 31 | /** |
| 33 | -* Array of `LineChartData` objects, one for each line. | 32 | + * Array of `LineChartData` objects, one for each line. |
| 34 | -*/ | 33 | + */ |
| 35 | @property (strong, nonatomic) NSArray *chartData; | 34 | @property (strong, nonatomic) NSArray *chartData; |
| 36 | 35 | ||
| 37 | @property (strong, nonatomic) NSMutableArray * pathPoints; | 36 | @property (strong, nonatomic) NSMutableArray * pathPoints; |
| 38 | 37 | ||
| 39 | @property (nonatomic) CGFloat xLabelWidth; | 38 | @property (nonatomic) CGFloat xLabelWidth; |
| 40 | 39 | ||
| 41 | -@property (nonatomic) float yValueMax; | 40 | +@property (nonatomic) CGFloat yValueMax; |
| 41 | + | ||
| 42 | +@property (nonatomic) CGFloat yValueMin; | ||
| 43 | + | ||
| 44 | +@property (nonatomic) NSInteger yLabelNum; | ||
| 45 | + | ||
| 46 | +@property (nonatomic) CGFloat yLabelHeight; | ||
| 47 | + | ||
| 48 | +@property (nonatomic) CGFloat chartCavanHeight; | ||
| 49 | + | ||
| 50 | +@property (nonatomic) CGFloat chartCavanWidth; | ||
| 51 | + | ||
| 52 | +@property (nonatomic) CGFloat chartMargin; | ||
| 42 | 53 | ||
| 43 | -@property (nonatomic) float chartCavanHeight; | ||
| 44 | 54 | ||
| 45 | -@property (nonatomic) float xLabelHeight; | ||
| 46 | 55 | ||
| 47 | @property (nonatomic) BOOL showLabel; | 56 | @property (nonatomic) BOOL showLabel; |
| 48 | 57 |
| @@ -55,15 +55,16 @@ | @@ -55,15 +55,16 @@ | ||
| 55 | -(void)setYLabels:(NSArray *)yLabels | 55 | -(void)setYLabels:(NSArray *)yLabels |
| 56 | { | 56 | { |
| 57 | 57 | ||
| 58 | - float level = _yValueMax / 5.0; | 58 | + CGFloat yStep = (_yValueMax-_yValueMin) / _yLabelNum; |
| 59 | + CGFloat yStepHeight = _chartCavanHeight / _yLabelNum; | ||
| 60 | + | ||
| 59 | 61 | ||
| 60 | NSInteger index = 0; | 62 | NSInteger index = 0; |
| 61 | - NSInteger num = [yLabels count] + 1; | 63 | + NSInteger num = _yLabelNum+1; |
| 62 | while (num > 0) { | 64 | while (num > 0) { |
| 63 | - CGFloat levelHeight = _chartCavanHeight /5.0; | 65 | + PNChartLabel * label = [[PNChartLabel alloc] initWithFrame:CGRectMake(0.0, (_chartCavanHeight - index * yStepHeight), _chartMargin, _yLabelHeight)]; |
| 64 | - PNChartLabel * label = [[PNChartLabel alloc] initWithFrame:CGRectMake(0.0,_chartCavanHeight - index * levelHeight + (levelHeight - yLabelHeight) , 20.0, yLabelHeight)]; | ||
| 65 | [label setTextAlignment:NSTextAlignmentRight]; | 66 | [label setTextAlignment:NSTextAlignmentRight]; |
| 66 | - label.text = [NSString stringWithFormat:@"%1.f",level * index]; | 67 | + label.text = [NSString stringWithFormat:@"%1.f",_yValueMin + (yStep * index)]; |
| 67 | [self addSubview:label]; | 68 | [self addSubview:label]; |
| 68 | index +=1 ; | 69 | index +=1 ; |
| 69 | num -= 1; | 70 | num -= 1; |
| @@ -74,14 +75,14 @@ | @@ -74,14 +75,14 @@ | ||
| 74 | -(void)setXLabels:(NSArray *)xLabels | 75 | -(void)setXLabels:(NSArray *)xLabels |
| 75 | { | 76 | { |
| 76 | _xLabels = xLabels; | 77 | _xLabels = xLabels; |
| 77 | - | 78 | + NSString* labelText; |
| 78 | if(_showLabel){ | 79 | if(_showLabel){ |
| 79 | - _xLabelWidth = (self.frame.size.width - chartMargin - 30.0)/[xLabels count]; | 80 | + _xLabelWidth = _chartCavanWidth/[xLabels count]; |
| 80 | 81 | ||
| 81 | for(int index = 0; index < xLabels.count; index++) | 82 | for(int index = 0; index < xLabels.count; index++) |
| 82 | { | 83 | { |
| 83 | - NSString* labelText = xLabels[index]; | 84 | + labelText = xLabels[index]; |
| 84 | - PNChartLabel * label = [[PNChartLabel alloc] initWithFrame:CGRectMake(index * _xLabelWidth + 30.0, self.frame.size.height - 30.0, _xLabelWidth, 20.0)]; | 85 | + PNChartLabel * label = [[PNChartLabel alloc] initWithFrame:CGRectMake(2*_chartMargin + (index * _xLabelWidth) - (_xLabelWidth / 2), _chartMargin + _chartCavanHeight, _xLabelWidth, _chartMargin)]; |
| 85 | [label setTextAlignment:NSTextAlignmentCenter]; | 86 | [label setTextAlignment:NSTextAlignmentCenter]; |
| 86 | label.text = labelText; | 87 | label.text = labelText; |
| 87 | [self addSubview:label]; | 88 | [self addSubview:label]; |
| @@ -137,44 +138,45 @@ | @@ -137,44 +138,45 @@ | ||
| 137 | for (NSUInteger lineIndex = 0; lineIndex < self.chartData.count; lineIndex++) { | 138 | for (NSUInteger lineIndex = 0; lineIndex < self.chartData.count; lineIndex++) { |
| 138 | PNLineChartData *chartData = self.chartData[lineIndex]; | 139 | PNLineChartData *chartData = self.chartData[lineIndex]; |
| 139 | CAShapeLayer *chartLine = (CAShapeLayer *) self.chartLineArray[lineIndex]; | 140 | CAShapeLayer *chartLine = (CAShapeLayer *) self.chartLineArray[lineIndex]; |
| 141 | + CGFloat yValue; | ||
| 142 | + CGFloat innerGrade; | ||
| 143 | + CGPoint point; | ||
| 140 | 144 | ||
| 141 | UIGraphicsBeginImageContext(self.frame.size); | 145 | UIGraphicsBeginImageContext(self.frame.size); |
| 142 | UIBezierPath * progressline = [UIBezierPath bezierPath]; | 146 | UIBezierPath * progressline = [UIBezierPath bezierPath]; |
| 143 | [_chartPath addObject:progressline]; | 147 | [_chartPath addObject:progressline]; |
| 144 | 148 | ||
| 145 | - PNLineChartDataItem *firstDataItem = chartData.getData(0); | ||
| 146 | - CGFloat firstValue = firstDataItem.y; | ||
| 147 | 149 | ||
| 148 | - CGFloat xPosition = _xLabelWidth; | ||
| 149 | 150 | ||
| 150 | if(!_showLabel){ | 151 | if(!_showLabel){ |
| 151 | - _chartCavanHeight = self.frame.size.height - _xLabelHeight*2; | 152 | + _chartCavanHeight = self.frame.size.height - 2*_yLabelHeight; |
| 152 | - xPosition = 0; | 153 | + _chartCavanWidth = self.frame.size.width; |
| 154 | + _chartMargin = 0.0; | ||
| 155 | + _xLabelWidth = (_chartCavanWidth / ([_xLabels count] -1)); | ||
| 153 | } | 156 | } |
| 154 | 157 | ||
| 155 | - CGFloat grade = (float)firstValue / _yValueMax; | ||
| 156 | NSMutableArray * linePointsArray = [[NSMutableArray alloc] init]; | 158 | NSMutableArray * linePointsArray = [[NSMutableArray alloc] init]; |
| 157 | - [progressline moveToPoint:CGPointMake( xPosition, _chartCavanHeight - grade * _chartCavanHeight + _xLabelHeight)]; | ||
| 158 | - [linePointsArray addObject:[NSValue valueWithCGPoint:CGPointMake( xPosition, _chartCavanHeight - grade * _chartCavanHeight + _xLabelHeight)]]; | ||
| 159 | [progressline setLineWidth:3.0]; | 159 | [progressline setLineWidth:3.0]; |
| 160 | [progressline setLineCapStyle:kCGLineCapRound]; | 160 | [progressline setLineCapStyle:kCGLineCapRound]; |
| 161 | [progressline setLineJoinStyle:kCGLineJoinRound]; | 161 | [progressline setLineJoinStyle:kCGLineJoinRound]; |
| 162 | 162 | ||
| 163 | 163 | ||
| 164 | - NSInteger index = 0; | 164 | + |
| 165 | + | ||
| 165 | for (NSUInteger i = 0; i < chartData.itemCount; i++) { | 166 | for (NSUInteger i = 0; i < chartData.itemCount; i++) { |
| 166 | 167 | ||
| 167 | - PNLineChartDataItem *dataItem = chartData.getData(i); | 168 | + yValue = chartData.getData(i).y; |
| 168 | - float value = dataItem.y; | ||
| 169 | 169 | ||
| 170 | - CGFloat innerGrade = value / _yValueMax; | 170 | + innerGrade = (yValue - _yValueMin) / ( _yValueMax - _yValueMin); |
| 171 | - if (index != 0) { | 171 | + |
| 172 | - CGPoint point = CGPointMake(index * _xLabelWidth + 30.0 + _xLabelWidth / 2.0, _chartCavanHeight - (innerGrade * _chartCavanHeight) + _xLabelHeight); | 172 | + point = CGPointMake(2*_chartMargin + (i * _xLabelWidth), _chartCavanHeight - (innerGrade * _chartCavanHeight) + ( _yLabelHeight /2 )); |
| 173 | - [linePointsArray addObject:[NSValue valueWithCGPoint:point]]; | 173 | + |
| 174 | + if (i != 0) { | ||
| 174 | [progressline addLineToPoint:point]; | 175 | [progressline addLineToPoint:point]; |
| 175 | - [progressline moveToPoint:point]; | ||
| 176 | } | 176 | } |
| 177 | - index += 1; | 177 | + |
| 178 | + [progressline moveToPoint:point]; | ||
| 179 | + [linePointsArray addObject:[NSValue valueWithCGPoint:point]]; | ||
| 178 | } | 180 | } |
| 179 | [_pathPoints addObject:[linePointsArray copy]]; | 181 | [_pathPoints addObject:[linePointsArray copy]]; |
| 180 | // setup the color of the chart line | 182 | // setup the color of the chart line |
| @@ -206,7 +208,8 @@ | @@ -206,7 +208,8 @@ | ||
| 206 | 208 | ||
| 207 | NSMutableArray *yLabelsArray = [NSMutableArray arrayWithCapacity:data.count]; | 209 | NSMutableArray *yLabelsArray = [NSMutableArray arrayWithCapacity:data.count]; |
| 208 | CGFloat yMax = 0.0f; | 210 | CGFloat yMax = 0.0f; |
| 209 | - | 211 | + CGFloat yMin = MAXFLOAT; |
| 212 | + CGFloat yValue; | ||
| 210 | // remove all shape layers before adding new ones | 213 | // remove all shape layers before adding new ones |
| 211 | for (CALayer *layer in self.chartLineArray) { | 214 | for (CALayer *layer in self.chartLineArray) { |
| 212 | [layer removeFromSuperlayer]; | 215 | [layer removeFromSuperlayer]; |
| @@ -226,10 +229,10 @@ | @@ -226,10 +229,10 @@ | ||
| 226 | [self.chartLineArray addObject:chartLine]; | 229 | [self.chartLineArray addObject:chartLine]; |
| 227 | 230 | ||
| 228 | for (NSUInteger i = 0; i < chartData.itemCount; i++) { | 231 | for (NSUInteger i = 0; i < chartData.itemCount; i++) { |
| 229 | - PNLineChartDataItem *dataItem = chartData.getData(i); | 232 | + yValue = chartData.getData(i).y; |
| 230 | - CGFloat yValue = dataItem.y; | ||
| 231 | [yLabelsArray addObject:[NSString stringWithFormat:@"%2f", yValue]]; | 233 | [yLabelsArray addObject:[NSString stringWithFormat:@"%2f", yValue]]; |
| 232 | - yMax = fmaxf(yMax, dataItem.y); | 234 | + yMax = fmaxf(yMax, yValue); |
| 235 | + yMin = fminf(yMin, yValue); | ||
| 233 | } | 236 | } |
| 234 | } | 237 | } |
| 235 | 238 | ||
| @@ -237,6 +240,11 @@ | @@ -237,6 +240,11 @@ | ||
| 237 | if (yMax < 5) { | 240 | if (yMax < 5) { |
| 238 | yMax = 5.0f; | 241 | yMax = 5.0f; |
| 239 | } | 242 | } |
| 243 | + if (yMin < 0){ | ||
| 244 | + yMin = 0.0f; | ||
| 245 | + } | ||
| 246 | + | ||
| 247 | + _yValueMin = yMin; | ||
| 240 | _yValueMax = yMax; | 248 | _yValueMax = yMax; |
| 241 | 249 | ||
| 242 | _chartData = data; | 250 | _chartData = data; |
| @@ -259,8 +267,14 @@ | @@ -259,8 +267,14 @@ | ||
| 259 | _showLabel = YES; | 267 | _showLabel = YES; |
| 260 | _pathPoints = [[NSMutableArray alloc] init]; | 268 | _pathPoints = [[NSMutableArray alloc] init]; |
| 261 | self.userInteractionEnabled = YES; | 269 | self.userInteractionEnabled = YES; |
| 262 | - _xLabelHeight = 20.0; | 270 | + |
| 263 | - _chartCavanHeight = self.frame.size.height - chartMargin * 2 - _xLabelHeight*2 ; | 271 | + _yLabelNum = 5.0; |
| 272 | + _yLabelHeight = [[[[PNChartLabel alloc] init] font] pointSize]; | ||
| 273 | + | ||
| 274 | + _chartMargin = 30; | ||
| 275 | + | ||
| 276 | + _chartCavanWidth = self.frame.size.width - _chartMargin *2; | ||
| 277 | + _chartCavanHeight = self.frame.size.height - _chartMargin * 2; | ||
| 264 | } | 278 | } |
| 265 | 279 | ||
| 266 | @end | 280 | @end |
-
Please register or login to post a comment