Compare commits
19 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| e2b17820bf | |||
| b59904e5b9 | |||
| 1d8f78d751 | |||
| 3cc39124b8 | |||
| bedd7e2c71 | |||
| 786af91666 | |||
| b7927cddb7 | |||
| 0f2d4d766c | |||
| 64de3e6e23 | |||
| 87fb8ee7b8 | |||
| 7c0dfe3eb5 | |||
| 87b62ad2b1 | |||
| 9c0d788418 | |||
| de009f0236 | |||
| d46e4fe14d | |||
| 236336fdf3 | |||
| 9b60a1d662 | |||
| 3700b4e2e2 | |||
| 8c03033a1c |
@@ -1,5 +1,25 @@
|
||||
# Changelog
|
||||
|
||||
## <a href="https://github.com/Jawbone/JBChartView/tree/v2.5.0">2.5.0</a>
|
||||
#### 05/04/14
|
||||
- Fixes issue <a href="https://github.com/Jawbone/JBChartView/pull/48">#48</a>.
|
||||
|
||||
## <a href="https://github.com/Jawbone/JBChartView/tree/v2.4.3">2.4.3</a>
|
||||
#### 05/04/14
|
||||
- Fixes issue <a href="https://github.com/Jawbone/JBChartView/pull/49">#49</a>.
|
||||
|
||||
## <a href="https://github.com/Jawbone/JBChartView/tree/v2.4.2">2.4.2</a>
|
||||
#### 04/30/14
|
||||
- Fixes issue <a href="https://github.com/Jawbone/JBChartView/pull/46">#46</a>.
|
||||
|
||||
## <a href="https://github.com/Jawbone/JBChartView/tree/v2.4.1">2.4.1</a>
|
||||
#### 04/30/14
|
||||
- Fixes issue <a href="https://github.com/Jawbone/JBChartView/pull/45">#45</a>.
|
||||
|
||||
## <a href="https://github.com/Jawbone/JBChartView/tree/v2.4.0">2.4.0</a>
|
||||
#### 04/28/14
|
||||
- Fixes issue <a href="https://github.com/Jawbone/JBChartView/pull/23">#23</a>.
|
||||
|
||||
## <a href="https://github.com/Jawbone/JBChartView/tree/v2.3.0">2.3.0</a>
|
||||
#### 04/17/14
|
||||
- Fixes issue <a href="https://github.com/Jawbone/JBChartView/pull/34">#34</a>.
|
||||
|
||||
+18
-33
@@ -18,6 +18,13 @@ NSInteger static const kJBBarChartViewUndefinedBarIndex = -1;
|
||||
// Colors (JBChartView)
|
||||
static UIColor *kJBBarChartViewDefaultBarColor = nil;
|
||||
|
||||
@interface JBChartView (Private)
|
||||
|
||||
- (BOOL)hasMaximumValue;
|
||||
- (BOOL)hasMinimumValue;
|
||||
|
||||
@end
|
||||
|
||||
@interface JBBarChartView ()
|
||||
|
||||
@property (nonatomic, strong) NSDictionary *chartDataDictionary; // key = column, value = height
|
||||
@@ -34,8 +41,6 @@ static UIColor *kJBBarChartViewDefaultBarColor = nil;
|
||||
// View quick accessors
|
||||
- (CGFloat)availableHeight;
|
||||
- (CGFloat)normalizedHeightForRawHeight:(NSNumber*)rawHeight;
|
||||
- (CGFloat)minHeight;
|
||||
- (CGFloat)maxHeight;
|
||||
- (CGFloat)barWidth;
|
||||
- (CGFloat)popOffset;
|
||||
|
||||
@@ -252,8 +257,8 @@ static UIColor *kJBBarChartViewDefaultBarColor = nil;
|
||||
|
||||
- (CGFloat)normalizedHeightForRawHeight:(NSNumber*)rawHeight
|
||||
{
|
||||
CGFloat minHeight = [self minHeight];
|
||||
CGFloat maxHeight = [self maxHeight];
|
||||
CGFloat minHeight = [self minimumValue];
|
||||
CGFloat maxHeight = [self maximumValue];
|
||||
CGFloat value = [rawHeight floatValue];
|
||||
|
||||
if ((maxHeight - minHeight) <= 0)
|
||||
@@ -264,24 +269,6 @@ static UIColor *kJBBarChartViewDefaultBarColor = nil;
|
||||
return ((value - minHeight) / (maxHeight - minHeight)) * [self availableHeight];
|
||||
}
|
||||
|
||||
- (CGFloat)minHeight
|
||||
{
|
||||
if (self.mininumValue != kJBChartViewUndefinedMinimumValue)
|
||||
{
|
||||
return MIN(self.mininumValue, self.cachedMinHeight);
|
||||
}
|
||||
return self.cachedMinHeight;
|
||||
}
|
||||
|
||||
- (CGFloat)maxHeight
|
||||
{
|
||||
if (self.maximumValue != kJBChartViewUndefinedMaximumValue)
|
||||
{
|
||||
return MAX(self.maximumValue, self.cachedMaxHeight);
|
||||
}
|
||||
return self.cachedMaxHeight;
|
||||
}
|
||||
|
||||
- (CGFloat)barWidth
|
||||
{
|
||||
NSUInteger barCount = [[self.chartDataDictionary allKeys] count];
|
||||
@@ -380,8 +367,7 @@ static UIColor *kJBBarChartViewDefaultBarColor = nil;
|
||||
{
|
||||
if(_cachedMinHeight == kJBBarChartViewUndefinedCachedHeight)
|
||||
{
|
||||
// min height is min value across all goals and values
|
||||
NSArray *chartValues = [[[self.chartDataDictionary allValues] arrayByAddingObjectsFromArray:[self.chartDataDictionary allValues]] sortedArrayUsingSelector:@selector(compare:)];
|
||||
NSArray *chartValues = [[NSMutableArray arrayWithArray:[self.chartDataDictionary allValues]] sortedArrayUsingSelector:@selector(compare:)];
|
||||
_cachedMinHeight = [[chartValues firstObject] floatValue];
|
||||
}
|
||||
return _cachedMinHeight;
|
||||
@@ -391,29 +377,28 @@ static UIColor *kJBBarChartViewDefaultBarColor = nil;
|
||||
{
|
||||
if (_cachedMaxHeight == kJBBarChartViewUndefinedCachedHeight)
|
||||
{
|
||||
// max height is max value across all goals and values
|
||||
NSArray *chartValues = [[[self.chartDataDictionary allValues] arrayByAddingObjectsFromArray:[self.chartDataDictionary allValues]] sortedArrayUsingSelector:@selector(compare:)];
|
||||
NSArray *chartValues = [[NSMutableArray arrayWithArray:[self.chartDataDictionary allValues]] sortedArrayUsingSelector:@selector(compare:)];
|
||||
_cachedMaxHeight = [[chartValues lastObject] floatValue];
|
||||
}
|
||||
return _cachedMaxHeight;
|
||||
}
|
||||
|
||||
- (CGFloat)mininumValue
|
||||
- (CGFloat)minimumValue
|
||||
{
|
||||
if ([super mininumValue] == kJBChartViewUndefinedMinimumValue)
|
||||
if ([self hasMinimumValue])
|
||||
{
|
||||
return self.cachedMinHeight;
|
||||
return fminf(self.cachedMinHeight, [super minimumValue]);
|
||||
}
|
||||
return [super mininumValue];
|
||||
return self.cachedMinHeight;
|
||||
}
|
||||
|
||||
- (CGFloat)maximumValue
|
||||
{
|
||||
if ([super maximumValue] == kJBChartViewUndefinedMaximumValue)
|
||||
if ([self hasMaximumValue])
|
||||
{
|
||||
return self.cachedMaxHeight;
|
||||
return fmaxf(self.cachedMaxHeight, [super maximumValue]);
|
||||
}
|
||||
return [super maximumValue];
|
||||
return self.cachedMaxHeight;
|
||||
}
|
||||
|
||||
#pragma mark - Touch Helpers
|
||||
|
||||
@@ -9,8 +9,6 @@
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
extern CGFloat const kJBChartViewDefaultAnimationDuration;
|
||||
extern CGFloat const kJBChartViewUndefinedMinimumValue; // helper for undefined min/max values
|
||||
extern CGFloat const kJBChartViewUndefinedMaximumValue;
|
||||
|
||||
/**
|
||||
* At a minimum, a chart can support two states, along with animations to-and-from.
|
||||
@@ -43,7 +41,10 @@ typedef NS_ENUM(NSInteger, JBChartViewState){
|
||||
|
||||
/**
|
||||
* The minimum and maxmimum values of the chart.
|
||||
* If no value(s) are supplied, the min and max values of the chart's data source are used.
|
||||
* If no value(s) are supplied:
|
||||
*
|
||||
* minimumValue = 0
|
||||
* maxmimumValue = chart's data source max value.
|
||||
*
|
||||
* If value(s) are supplied, they must be >= 0, otherwise an assertion will be thrown.
|
||||
* The min/max values are clamped to the ceiling and floor of the actual min/max values of the chart's data source;
|
||||
@@ -51,9 +52,12 @@ typedef NS_ENUM(NSInteger, JBChartViewState){
|
||||
*
|
||||
* For min/max modifications to take effect, reloadData must be called.
|
||||
*/
|
||||
@property (nonatomic, assign) CGFloat mininumValue;
|
||||
@property (nonatomic, assign) CGFloat minimumValue;
|
||||
@property (nonatomic, assign) CGFloat maximumValue;
|
||||
|
||||
- (void)resetMinimumValue; // resets to default (0)
|
||||
- (void)resetMaximumValue; // reset to default (chart's data source max value)
|
||||
|
||||
/**
|
||||
* Charts can either be expanded or contracted.
|
||||
* By default, a chart should be expanded on initialization.
|
||||
|
||||
+21
-7
@@ -8,15 +8,18 @@
|
||||
|
||||
#import "JBChartView.h"
|
||||
|
||||
// Numerics
|
||||
CGFloat const kJBChartViewDefaultAnimationDuration = 0.25f;
|
||||
CGFloat const kJBChartViewUndefinedMinimumValue = -1.0f;
|
||||
CGFloat const kJBChartViewUndefinedMaximumValue = -1.0f;
|
||||
CGFloat const kJBChartViewDefaulMinimumValue = 0.0f;
|
||||
|
||||
// Color (JBChartSelectionView)
|
||||
static UIColor *kJBChartVerticalSelectionViewDefaultBgColor = nil;
|
||||
|
||||
@interface JBChartView ()
|
||||
|
||||
@property (nonatomic, assign) BOOL hasMaximumValue;
|
||||
@property (nonatomic, assign) BOOL hasMinimumValue;
|
||||
|
||||
// Construction
|
||||
- (void)constructChartView;
|
||||
|
||||
@@ -59,8 +62,7 @@ static UIColor *kJBChartVerticalSelectionViewDefaultBgColor = nil;
|
||||
- (void)constructChartView
|
||||
{
|
||||
self.clipsToBounds = YES;
|
||||
_mininumValue = kJBChartViewUndefinedMinimumValue;
|
||||
_maximumValue = kJBChartViewUndefinedMaximumValue;
|
||||
self.minimumValue = kJBChartViewDefaulMinimumValue;
|
||||
}
|
||||
|
||||
#pragma mark - Public
|
||||
@@ -138,16 +140,28 @@ static UIColor *kJBChartVerticalSelectionViewDefaultBgColor = nil;
|
||||
[self setState:state animated:NO];
|
||||
}
|
||||
|
||||
- (void)setMininumValue:(CGFloat)mininumValue
|
||||
- (void)setMinimumValue:(CGFloat)minimumValue
|
||||
{
|
||||
NSAssert(mininumValue >= 0, @"JBChartView // the minimumValue must be >= 0.");
|
||||
_mininumValue = mininumValue;
|
||||
NSAssert(minimumValue >= 0, @"JBChartView // the minimumValue must be >= 0.");
|
||||
_minimumValue = minimumValue;
|
||||
_hasMinimumValue = YES;
|
||||
}
|
||||
|
||||
- (void)setMaximumValue:(CGFloat)maximumValue
|
||||
{
|
||||
NSAssert(maximumValue >= 0, @"JBChartView // the maximumValue must be >= 0.");
|
||||
_maximumValue = maximumValue;
|
||||
_hasMaximumValue = YES;
|
||||
}
|
||||
|
||||
- (void)resetMinimumValue
|
||||
{
|
||||
self.minimumValue = kJBChartViewDefaulMinimumValue; // resets to default
|
||||
}
|
||||
|
||||
- (void)resetMaximumValue
|
||||
{
|
||||
_hasMaximumValue = NO; // clears max
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
@@ -249,14 +249,14 @@ typedef NS_ENUM(NSInteger, JBLineChartViewLineStyle){
|
||||
- (BOOL)lineChartView:(JBLineChartView *)lineChartView showsDotsForLineAtLineIndex:(NSUInteger)lineIndex;
|
||||
|
||||
/**
|
||||
* Returns whether or not a line should be smoothed (rounded end caps and connections).
|
||||
* Returns whether or not a line should be rendered with curved connections and rounded end caps.
|
||||
*
|
||||
* Default: NO
|
||||
*
|
||||
* @param lineChartView The line chart object requesting this information.
|
||||
* @param lineIndex An index number identifying a line in the chart.
|
||||
*
|
||||
* @return Whether or not a line should smooth it's ends and connections.
|
||||
* @return Whether or not a line should smooth it's connections and end caps.
|
||||
*/
|
||||
- (BOOL)lineChartView:(JBLineChartView *)lineChartView smoothLineAtLineIndex:(NSUInteger)lineIndex;
|
||||
|
||||
|
||||
+70
-48
@@ -24,6 +24,8 @@ CGFloat static const kJBLineChartLinesViewMiterLimit = -5.0;
|
||||
CGFloat static const kJBLineChartLinesViewDefaultLinePhase = 1.0f;
|
||||
CGFloat static const kJBLineChartLinesViewDefaultDimmedOpacity = 0.20f;
|
||||
NSInteger static const kJBLineChartLinesViewUnselectedLineIndex = -1;
|
||||
CGFloat static const kJBLineChartLinesViewSmoothThresholdSlope = 0.01f;
|
||||
NSInteger static const kJBLineChartLinesViewSmoothThresholdVertical = 1;
|
||||
|
||||
// Numerics (JBLineChartDotsView)
|
||||
NSInteger static const kJBLineChartDotsViewDefaultRadiusFactor = 3; // 3x size of line width
|
||||
@@ -48,6 +50,13 @@ static UIColor *kJBLineChartViewDefaultDotColor = nil;
|
||||
static UIColor *kJBLineChartViewDefaultLineSelectionColor = nil;
|
||||
static UIColor *kJBLineChartViewDefaultDotSelectionColor = nil;
|
||||
|
||||
@interface JBChartView (Private)
|
||||
|
||||
- (BOOL)hasMaximumValue;
|
||||
- (BOOL)hasMinimumValue;
|
||||
|
||||
@end
|
||||
|
||||
@interface JBLineLayer : CAShapeLayer
|
||||
|
||||
@property (nonatomic, assign) NSUInteger tag;
|
||||
@@ -147,8 +156,6 @@ static UIColor *kJBLineChartViewDefaultDotSelectionColor = nil;
|
||||
// View quick accessors
|
||||
- (CGFloat)normalizedHeightForRawHeight:(CGFloat)rawHeight;
|
||||
- (CGFloat)availableHeight;
|
||||
- (CGFloat)minHeight;
|
||||
- (CGFloat)maxHeight;
|
||||
- (CGFloat)padding;
|
||||
- (NSUInteger)dataCount;
|
||||
|
||||
@@ -244,7 +251,7 @@ static UIColor *kJBLineChartViewDefaultDotSelectionColor = nil;
|
||||
CGFloat pointSpace = (self.bounds.size.width - (chartPadding * 2)) / ([self dataCount] - 1); // Space in between points
|
||||
CGFloat xOffset = chartPadding;
|
||||
CGFloat yOffset = 0;
|
||||
|
||||
|
||||
NSMutableArray *mutableChartData = [NSMutableArray array];
|
||||
NSAssert([self.dataSource respondsToSelector:@selector(numberOfLinesInLineChartView:)], @"JBLineChartView // dataSource must implement - (NSUInteger)numberOfLinesInLineChartView:(JBLineChartView *)lineChartView");
|
||||
for (NSUInteger lineIndex=0; lineIndex<[self.dataSource numberOfLinesInLineChartView:self]; lineIndex++)
|
||||
@@ -253,7 +260,7 @@ static UIColor *kJBLineChartViewDefaultDotSelectionColor = nil;
|
||||
NSUInteger dataCount = [self.dataSource lineChartView:self numberOfVerticalValuesAtLineIndex:lineIndex];
|
||||
NSMutableArray *chartPointData = [NSMutableArray array];
|
||||
for (NSUInteger horizontalIndex=0; horizontalIndex<dataCount; horizontalIndex++)
|
||||
{
|
||||
{
|
||||
NSAssert([self.delegate respondsToSelector:@selector(lineChartView:verticalValueForHorizontalIndex:atLineIndex:)], @"JBLineChartView // delegate must implement - (CGFloat)lineChartView:(JBLineChartView *)lineChartView verticalValueForHorizontalIndex:(NSUInteger)horizontalIndex atLineIndex:(NSUInteger)lineIndex");
|
||||
CGFloat rawHeight = [self.delegate lineChartView:self verticalValueForHorizontalIndex:horizontalIndex atLineIndex:lineIndex];
|
||||
NSAssert(rawHeight >= 0, @"JBLineChartView // delegate function - (CGFloat)lineChartView:(JBLineChartView *)lineChartView verticalValueForHorizontalIndex:(NSUInteger)horizontalIndex atLineIndex:(NSUInteger)lineIndex must return a CGFloat >= 0");
|
||||
@@ -288,7 +295,7 @@ static UIColor *kJBLineChartViewDefaultDotSelectionColor = nil;
|
||||
// Create new line and overlay subviews
|
||||
self.linesView = [[JBLineChartLinesView alloc] initWithFrame:CGRectOffset(mainViewRect, 0, self.headerView.frame.size.height + self.headerPadding)];
|
||||
self.linesView.delegate = self;
|
||||
|
||||
|
||||
// Add new lines view
|
||||
if (self.footerView)
|
||||
{
|
||||
@@ -382,8 +389,8 @@ static UIColor *kJBLineChartViewDefaultDotSelectionColor = nil;
|
||||
|
||||
- (CGFloat)normalizedHeightForRawHeight:(CGFloat)rawHeight
|
||||
{
|
||||
CGFloat minHeight = [self minHeight];
|
||||
CGFloat maxHeight = [self maxHeight];
|
||||
CGFloat minHeight = [self minimumValue];
|
||||
CGFloat maxHeight = [self maximumValue];
|
||||
|
||||
if ((maxHeight - minHeight) <= 0)
|
||||
{
|
||||
@@ -398,24 +405,6 @@ static UIColor *kJBLineChartViewDefaultDotSelectionColor = nil;
|
||||
return self.bounds.size.height - self.headerView.frame.size.height - self.footerView.frame.size.height - self.headerPadding;
|
||||
}
|
||||
|
||||
- (CGFloat)minHeight
|
||||
{
|
||||
if (self.mininumValue != kJBChartViewUndefinedMinimumValue)
|
||||
{
|
||||
return MIN(self.mininumValue, self.cachedMinHeight);
|
||||
}
|
||||
return self.cachedMinHeight;
|
||||
}
|
||||
|
||||
- (CGFloat)maxHeight
|
||||
{
|
||||
if (self.maximumValue != kJBChartViewUndefinedMaximumValue)
|
||||
{
|
||||
return MAX(self.maximumValue, self.cachedMaxHeight);
|
||||
}
|
||||
return self.cachedMaxHeight;
|
||||
}
|
||||
|
||||
- (CGFloat)padding
|
||||
{
|
||||
CGFloat maxLineWidth = 0.0f;
|
||||
@@ -508,15 +497,6 @@ static UIColor *kJBLineChartViewDefaultDotSelectionColor = nil;
|
||||
return [self padding];
|
||||
}
|
||||
|
||||
- (BOOL)lineChartLinesView:(JBLineChartLinesView *)lineChartLinesView smoothLineAtLineIndex:(NSUInteger)lineIndex
|
||||
{
|
||||
if ([self.dataSource respondsToSelector:@selector(lineChartView:smoothLineAtLineIndex:)])
|
||||
{
|
||||
return [self.dataSource lineChartView:self smoothLineAtLineIndex:lineIndex];
|
||||
}
|
||||
return NO;
|
||||
}
|
||||
|
||||
- (JBLineChartViewLineStyle)lineChartLinesView:(JBLineChartLinesView *)lineChartLinesView lineStyleForLineAtLineIndex:(NSUInteger)lineIndex
|
||||
{
|
||||
if ([self.dataSource respondsToSelector:@selector(lineChartView:lineStyleForLineAtLineIndex:)])
|
||||
@@ -526,6 +506,15 @@ static UIColor *kJBLineChartViewDefaultDotSelectionColor = nil;
|
||||
return JBLineChartViewLineStyleSolid;
|
||||
}
|
||||
|
||||
- (BOOL)lineChartLinesView:(JBLineChartLinesView *)lineChartLinesView smoothLineAtLineIndex:(NSUInteger)lineIndex
|
||||
{
|
||||
if ([self.dataSource respondsToSelector:@selector(lineChartView:smoothLineAtLineIndex:)])
|
||||
{
|
||||
return [self.dataSource lineChartView:self smoothLineAtLineIndex:lineIndex];
|
||||
}
|
||||
return NO;
|
||||
}
|
||||
|
||||
#pragma mark - JBLineChartDotsViewDelegate
|
||||
|
||||
- (NSArray *)chartDataForLineChartDotsView:(JBLineChartDotsView*)lineChartDotsView
|
||||
@@ -722,22 +711,22 @@ static UIColor *kJBLineChartViewDefaultDotSelectionColor = nil;
|
||||
return _cachedMaxHeight;
|
||||
}
|
||||
|
||||
- (CGFloat)mininumValue
|
||||
- (CGFloat)minimumValue
|
||||
{
|
||||
if ([super mininumValue] == kJBChartViewUndefinedMinimumValue)
|
||||
if ([self hasMinimumValue])
|
||||
{
|
||||
return self.cachedMinHeight;
|
||||
return fminf(self.cachedMinHeight, [super minimumValue]);
|
||||
}
|
||||
return [super mininumValue];
|
||||
return self.cachedMinHeight;
|
||||
}
|
||||
|
||||
- (CGFloat)maximumValue
|
||||
{
|
||||
if ([super maximumValue] == kJBChartViewUndefinedMaximumValue)
|
||||
if ([self hasMaximumValue])
|
||||
{
|
||||
return self.cachedMaxHeight;
|
||||
return fmaxf(self.cachedMaxHeight, [super maximumValue]);
|
||||
}
|
||||
return [super maximumValue];
|
||||
return self.cachedMaxHeight;
|
||||
}
|
||||
|
||||
#pragma mark - Touch Helpers
|
||||
@@ -1051,8 +1040,15 @@ static UIColor *kJBLineChartViewDefaultDotSelectionColor = nil;
|
||||
UIBezierPath *path = [UIBezierPath bezierPath];
|
||||
path.miterLimit = kJBLineChartLinesViewMiterLimit;
|
||||
|
||||
JBLineChartPoint *previousLineChartPoint = nil;
|
||||
CGFloat previousSlope;
|
||||
|
||||
NSAssert([self.delegate respondsToSelector:@selector(lineChartLinesView:smoothLineAtLineIndex:)], @"JBLineChartLinesView // delegate must implement - (BOOL)lineChartLinesView:(JBLineChartLinesView *)lineChartLinesView smoothLineAtLineIndex:(NSUInteger)lineIndex");
|
||||
BOOL smoothLine = [self.delegate lineChartLinesView:self smoothLineAtLineIndex:lineIndex];
|
||||
|
||||
NSUInteger index = 0;
|
||||
for (JBLineChartPoint *lineChartPoint in [lineData sortedArrayUsingSelector:@selector(compare:)])
|
||||
NSArray *sortedLineData = [lineData sortedArrayUsingSelector:@selector(compare:)];
|
||||
for (JBLineChartPoint *lineChartPoint in sortedLineData)
|
||||
{
|
||||
if (index == 0)
|
||||
{
|
||||
@@ -1060,9 +1056,37 @@ static UIColor *kJBLineChartViewDefaultDotSelectionColor = nil;
|
||||
}
|
||||
else
|
||||
{
|
||||
[path addLineToPoint:CGPointMake(lineChartPoint.position.x, fmin(self.bounds.size.height - padding, fmax(padding, lineChartPoint.position.y)))];
|
||||
JBLineChartPoint *nextLineChartPoint = nil;
|
||||
if (index != ([lineData count] - 1))
|
||||
{
|
||||
nextLineChartPoint = [sortedLineData objectAtIndex:(index + 1)];
|
||||
}
|
||||
|
||||
CGFloat nextSlope = (nextLineChartPoint != nil) ? ((nextLineChartPoint.position.y - lineChartPoint.position.y)) / ((nextLineChartPoint.position.x - lineChartPoint.position.x)) : previousSlope;
|
||||
CGFloat currentSlope = ((lineChartPoint.position.y - previousLineChartPoint.position.y)) / (lineChartPoint.position.x-previousLineChartPoint.position.x);
|
||||
|
||||
BOOL deltaFromNextSlope = ((currentSlope >= (nextSlope + kJBLineChartLinesViewSmoothThresholdSlope)) || (currentSlope <= (nextSlope - kJBLineChartLinesViewSmoothThresholdSlope)));
|
||||
BOOL deltaFromPreviousSlope = ((currentSlope >= (previousSlope + kJBLineChartLinesViewSmoothThresholdSlope)) || (currentSlope <= (previousSlope - kJBLineChartLinesViewSmoothThresholdSlope)));
|
||||
BOOL deltaFromPreviousY = (lineChartPoint.position.y >= previousLineChartPoint.position.y + kJBLineChartLinesViewSmoothThresholdVertical) || (lineChartPoint.position.y <= previousLineChartPoint.position.y - kJBLineChartLinesViewSmoothThresholdVertical);
|
||||
|
||||
if (smoothLine && deltaFromNextSlope && deltaFromPreviousSlope && deltaFromPreviousY)
|
||||
{
|
||||
CGFloat deltaX = lineChartPoint.position.x - previousLineChartPoint.position.x;
|
||||
CGFloat controlPointX = previousLineChartPoint.position.x + (deltaX / 2);
|
||||
|
||||
CGPoint controlPoint1 = CGPointMake(controlPointX, previousLineChartPoint.position.y);
|
||||
CGPoint controlPoint2 = CGPointMake(controlPointX, lineChartPoint.position.y);
|
||||
|
||||
[path addCurveToPoint:CGPointMake(lineChartPoint.position.x, fmin(self.bounds.size.height - padding, fmax(padding, lineChartPoint.position.y))) controlPoint1:controlPoint1 controlPoint2:controlPoint2];
|
||||
}
|
||||
else
|
||||
{
|
||||
[path addLineToPoint:CGPointMake(lineChartPoint.position.x, fmin(self.bounds.size.height - padding, fmax(padding, lineChartPoint.position.y)))];
|
||||
}
|
||||
|
||||
previousSlope = currentSlope;
|
||||
}
|
||||
|
||||
previousLineChartPoint = lineChartPoint;
|
||||
index++;
|
||||
}
|
||||
|
||||
@@ -1079,9 +1103,7 @@ static UIColor *kJBLineChartViewDefaultDotSelectionColor = nil;
|
||||
NSAssert([self.delegate respondsToSelector:@selector(lineChartLinesView:colorForLineAtLineIndex:)], @"JBLineChartLinesView // delegate must implement - (UIColor *)lineChartLinesView:(JBLineChartLinesView *)lineChartLinesView colorForLineAtLineIndex:(NSUInteger)lineIndex");
|
||||
shapeLayer.strokeColor = [self.delegate lineChartLinesView:self colorForLineAtLineIndex:lineIndex].CGColor;
|
||||
|
||||
NSAssert([self.delegate respondsToSelector:@selector(lineChartLinesView:smoothLineAtLineIndex:)], @"JBLineChartLinesView // delegate must implement - (UIColor *)lineChartLinesView:(JBLineChartLinesView *)lineChartLinesView colorForLineAtLineIndex:(NSUInteger)lineIndex");
|
||||
BOOL smoothLine = [self.delegate lineChartLinesView:self smoothLineAtLineIndex:lineIndex];
|
||||
if (smoothLine)
|
||||
if (smoothLine == YES)
|
||||
{
|
||||
shapeLayer.lineCap = kCALineCapRound;
|
||||
shapeLayer.lineJoin = kCALineJoinRound;
|
||||
@@ -1228,7 +1250,7 @@ static UIColor *kJBLineChartViewDefaultDotSelectionColor = nil;
|
||||
NSMutableArray *mutableDotViews = [NSMutableArray array];
|
||||
NSUInteger horizontalIndex = 0;
|
||||
for (JBLineChartPoint *lineChartPoint in [lineData sortedArrayUsingSelector:@selector(compare:)])
|
||||
{
|
||||
{
|
||||
NSAssert([self.delegate respondsToSelector:@selector(lineChartDotsView:dotRadiusForLineAtLineIndex:)], @"JBLineChartDotsView // delegate must implement - (CGFloat)lineChartDotsView:(JBLineChartDotsView *)lineChartDotsView dotRadiusForLineAtLineIndex:(NSUInteger)lineIndex");
|
||||
CGFloat dotRadius = [self.delegate lineChartDotsView:self dotRadiusForLineAtLineIndex:lineIndex];
|
||||
|
||||
|
||||
@@ -1,17 +1,19 @@
|
||||
Pod::Spec.new do |s|
|
||||
s.name = "JBChartView"
|
||||
s.version = "2.3.0"
|
||||
s.version = "2.5.0"
|
||||
s.summary = "Jawbone's iOS-based charting library for both line and bar graphs."
|
||||
s.homepage = "https://github.com/Jawbone/JBChartView"
|
||||
|
||||
s.screenshot = "https://raw.github.com/Jawbone/JBChartView/master/Screenshots/main.png"
|
||||
|
||||
s.license = { :type => 'Apache', :file => 'LICENSE' }
|
||||
s.author = { "Terry Worona" => "tworona@jawbone.com" }
|
||||
s.source = {
|
||||
:git => "https://github.com/Jawbone/JBChartView.git",
|
||||
:tag => "v2.3.0"
|
||||
:tag => "v2.5.0"
|
||||
}
|
||||
|
||||
s.platform = :ios, '7.0'
|
||||
s.source_files = 'Classes', 'Classes/**/*.{h,m}'
|
||||
s.source_files = 'Classes/**/*.{h,m}'
|
||||
s.requires_arc = true
|
||||
end
|
||||
@@ -38,7 +38,7 @@ Simply add the following line to your <code>Podfile</code>:
|
||||
Your Podfile should look something like:
|
||||
|
||||
platform :ios, '7.0'
|
||||
pod 'JBChartView', '~> 2.3.0'
|
||||
pod 'JBChartView', '~> 2.5.0'
|
||||
|
||||
### The Old School Way
|
||||
|
||||
@@ -212,7 +212,7 @@ To customize the color of each dot during selection and non-selection events (de
|
||||
|
||||
- (UIColor *)lineChartView:(JBLineChartView *)lineChartView selectionColorForDotAtHorizontalIndex:(NSUInteger)horizontalIndex atLineIndex:(NSUInteger)lineIndex;
|
||||
|
||||
As well, by default, each line will have squared off end caps and connection points. To enable line smoothing:
|
||||
As well, by default, each line will have squared off end caps and connection points. To enable rounded connections and end caps:
|
||||
|
||||
- (BOOL)lineChartView:(JBLineChartView *)lineChartView smoothLineAtLineIndex:(NSUInteger)lineIndex;
|
||||
|
||||
@@ -229,6 +229,21 @@ Lastly, a line chart's selection events are delegated back via:
|
||||
}
|
||||
|
||||
The <b>touchPoint</b> is especially important as it allows you to add custom elements to your chart during selection events. Refer to the demo project (<b>JBLineChartViewController</b>) to see how a tooltip can be used to display additional information during selection events.
|
||||
|
||||
## Minimum & Maximum Values
|
||||
|
||||
By default, a chart's minimum value (y-axis) is equal to 0. The maximum is equal to the max value supplied by the dataSource. You can override either value via:
|
||||
|
||||
- (void)setMinimumValue:(CGFloat)minimumValue;
|
||||
- (void)setMaximumValue:(CGFloat)maximumValue;
|
||||
|
||||
If value(s) are supplied, they must be >= 0, otherwise an assertion will be thrown. To reset the values back to their original defaults:
|
||||
|
||||
- (void)resetMinimumValue;
|
||||
- (void)resetMaximumValue;
|
||||
|
||||
The min/max values are clamped to the ceiling and floor of the actual min/max values of the chart's data source; for example, if a maximumValue of 20 is supplied & the chart's actual max is 100, then 100 will be used. For min/max modifications to take effect, reloadData must be called.
|
||||
|
||||
|
||||
## License
|
||||
|
||||
|
||||
Reference in New Issue
Block a user