Compare commits
16 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 9292655de8 | |||
| 5468952b53 | |||
| af508bb50c | |||
| 988c8c9ab9 | |||
| 7944c03962 | |||
| e28a0113f8 | |||
| 40ae91de47 | |||
| 251b6e888f | |||
| c2558f9975 | |||
| 2d1450340b | |||
| 706dbc1859 | |||
| 6cce1ae272 | |||
| 0b603cde1f | |||
| eacc211dbd | |||
| 641fb7f5fa | |||
| 28a660c57f |
@@ -1,5 +1,59 @@
|
||||
# Change Log
|
||||
|
||||
## [v3.0.12](https://github.com/Jawbone/JBChartView/tree/v3.0.12) (2016-06-22)
|
||||
[Full Changelog](https://github.com/Jawbone/JBChartView/compare/v3.0.11...v3.0.12)
|
||||
|
||||
## [v3.0.11](https://github.com/Jawbone/JBChartView/tree/v3.0.11) (2016-06-22)
|
||||
[Full Changelog](https://github.com/Jawbone/JBChartView/compare/v3.0.10...v3.0.11)
|
||||
|
||||
**Fixed bugs:**
|
||||
|
||||
- barChartView:barViewAtIndex: not called when reloading bar chart animated [\#207](https://github.com/Jawbone/JBChartView/issues/207)
|
||||
|
||||
**Closed issues:**
|
||||
|
||||
- Not able to change the color of linechart with custom color [\#208](https://github.com/Jawbone/JBChartView/issues/208)
|
||||
|
||||
**Merged pull requests:**
|
||||
|
||||
- Handle NaN line slope in line chart selection code. [\#209](https://github.com/Jawbone/JBChartView/pull/209) ([loumoore](https://github.com/loumoore))
|
||||
|
||||
## [v3.0.10](https://github.com/Jawbone/JBChartView/tree/v3.0.10) (2016-05-31)
|
||||
[Full Changelog](https://github.com/Jawbone/JBChartView/compare/v3.0.9...v3.0.10)
|
||||
|
||||
## [v3.0.9](https://github.com/Jawbone/JBChartView/tree/v3.0.9) (2016-04-28)
|
||||
[Full Changelog](https://github.com/Jawbone/JBChartView/compare/v3.0.8...v3.0.9)
|
||||
|
||||
**Implemented enhancements:**
|
||||
|
||||
- ability to set line chart view padding [\#205](https://github.com/Jawbone/JBChartView/issues/205)
|
||||
|
||||
**Fixed bugs:**
|
||||
|
||||
- old gradient fill shows if chart is scrolled offscreen [\#204](https://github.com/Jawbone/JBChartView/issues/204)
|
||||
|
||||
**Closed issues:**
|
||||
|
||||
- example of using gradient for fills [\#202](https://github.com/Jawbone/JBChartView/issues/202)
|
||||
|
||||
## [v3.0.8](https://github.com/Jawbone/JBChartView/tree/v3.0.8) (2016-02-29)
|
||||
[Full Changelog](https://github.com/Jawbone/JBChartView/compare/v3.0.7...v3.0.8)
|
||||
|
||||
**Fixed bugs:**
|
||||
|
||||
- Cannot change bar colors after initial load [\#201](https://github.com/Jawbone/JBChartView/issues/201)
|
||||
|
||||
## [v3.0.7](https://github.com/Jawbone/JBChartView/tree/v3.0.7) (2016-02-26)
|
||||
[Full Changelog](https://github.com/Jawbone/JBChartView/compare/v3.0.6...v3.0.7)
|
||||
|
||||
**Closed issues:**
|
||||
|
||||
- Directions not set in UIViewController [\#199](https://github.com/Jawbone/JBChartView/issues/199)
|
||||
- Many Line Charts in Table View [\#198](https://github.com/Jawbone/JBChartView/issues/198)
|
||||
|
||||
## [v3.0.6](https://github.com/Jawbone/JBChartView/tree/v3.0.6) (2016-01-21)
|
||||
[Full Changelog](https://github.com/Jawbone/JBChartView/compare/v3.0.5...v3.0.6)
|
||||
|
||||
## [v3.0.5](https://github.com/Jawbone/JBChartView/tree/v3.0.5) (2016-01-20)
|
||||
[Full Changelog](https://github.com/Jawbone/JBChartView/compare/v3.0.4...v3.0.5)
|
||||
|
||||
|
||||
@@ -111,6 +111,10 @@ static UIColor *kJBBarChartViewDefaultBarColor = nil;
|
||||
|
||||
- (void)construct
|
||||
{
|
||||
_chartData = [NSArray array];
|
||||
_barViews = [NSArray array];
|
||||
_cachedBarViewHeights = [NSArray array];
|
||||
|
||||
_showsVerticalSelection = YES;
|
||||
_cachedMinHeight = kJBBarChartViewUndefinedCachedHeight;
|
||||
_cachedMaxHeight = kJBBarChartViewUndefinedCachedHeight;
|
||||
@@ -145,6 +149,28 @@ static UIColor *kJBBarChartViewDefaultBarColor = nil;
|
||||
* Final block to refresh state and turn off reloading bit
|
||||
*/
|
||||
dispatch_block_t completionBlock = ^{
|
||||
|
||||
if (animated)
|
||||
{
|
||||
[self.chartData enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger index, BOOL * _Nonnull stop) {
|
||||
// Grab old bar
|
||||
UIView *oldBarView = [self.barViews objectAtIndex:index];
|
||||
|
||||
// Update bar instance
|
||||
UIView *barView = [self createBarViewForIndex:index];
|
||||
barView.frame = oldBarView.frame;
|
||||
|
||||
// Swap subviews
|
||||
[oldBarView removeFromSuperview];
|
||||
[self insertBarView:barView];
|
||||
|
||||
// Update bar colection
|
||||
NSMutableArray *mutableBarViews = [NSMutableArray arrayWithArray:self.barViews];
|
||||
[mutableBarViews replaceObjectAtIndex:index withObject:barView];
|
||||
self.barViews = [NSArray arrayWithArray:mutableBarViews];
|
||||
}];
|
||||
}
|
||||
|
||||
self.reloading = NO;
|
||||
[self setState:self.state animated:NO force:YES callback:nil];
|
||||
};
|
||||
@@ -580,7 +606,7 @@ static UIColor *kJBBarChartViewDefaultBarColor = nil;
|
||||
|
||||
dispatch_block_t callbackCopy = [callback copy];
|
||||
|
||||
if ([self.barViews count] > 0)
|
||||
if ([self.barViews count] > 0 && [self.cachedBarViewHeights count] == [self.barViews count])
|
||||
{
|
||||
if (animated)
|
||||
{
|
||||
|
||||
@@ -69,6 +69,15 @@ typedef NS_ENUM(NSInteger, JBChartViewState){
|
||||
@property (nonatomic, weak) id<JBChartViewDataSource> dataSource;
|
||||
@property (nonatomic, weak) id<JBChartViewDelegate> delegate;
|
||||
|
||||
/*
|
||||
* Since loading is such a common UIView requirement,
|
||||
* setting to YES will snapshot the chart, blur it, and display a loading indicator.
|
||||
*/
|
||||
@property (nonatomic, assign) BOOL loading;
|
||||
|
||||
- (void)setLoading:(BOOL)loading animated:(BOOL)animated callback:(void (^)())callback;
|
||||
- (void)setLoading:(BOOL)loading animated:(BOOL)animated;
|
||||
|
||||
/**
|
||||
* Header and footer views are shown above and below the chart respectively.
|
||||
* Each view will be stretched horizontally to fill width of chart.
|
||||
|
||||
@@ -16,6 +16,8 @@ static UIColor *kJBChartVerticalSelectionViewDefaultBgColor = nil;
|
||||
|
||||
@interface JBChartView ()
|
||||
|
||||
@property (nonatomic, strong) UIImageView *loadingImageView;
|
||||
|
||||
@property (nonatomic, assign) BOOL hasMaximumValue;
|
||||
@property (nonatomic, assign) BOOL hasMinimumValue;
|
||||
|
||||
@@ -77,8 +79,111 @@ static UIColor *kJBChartVerticalSelectionViewDefaultBgColor = nil;
|
||||
NSAssert((self.headerView.bounds.size.height + self.footerView.bounds.size.height) <= self.bounds.size.height, @"JBChartView // the combined height of the footer and header can not be greater than the total height of the chart.");
|
||||
}
|
||||
|
||||
#pragma mark - Getters
|
||||
|
||||
+ (UIImage *)imageWithView:(UIView *)view
|
||||
{
|
||||
UIGraphicsBeginImageContextWithOptions(view.bounds.size, view.opaque, 0.0);
|
||||
[view.layer renderInContext:UIGraphicsGetCurrentContext()];
|
||||
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
|
||||
UIGraphicsEndImageContext();
|
||||
return image;
|
||||
}
|
||||
|
||||
#pragma mark - Setters
|
||||
|
||||
- (void)setLoading:(BOOL)loading animated:(BOOL)animated callback:(void (^)())callback
|
||||
{
|
||||
if (_loading == loading)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
_loading = loading;
|
||||
|
||||
if (loading) // show
|
||||
{
|
||||
UIImage *snapshotImage = [JBChartView imageWithView:self];
|
||||
self.loadingImageView = [[UIImageView alloc] initWithImage:snapshotImage];
|
||||
self.loadingImageView.frame = self.bounds;
|
||||
|
||||
UIBlurEffect *blur = [UIBlurEffect effectWithStyle:UIBlurEffectStyleLight];
|
||||
UIVisualEffectView *effectView = [[UIVisualEffectView alloc] initWithEffect:blur];
|
||||
effectView.frame = self.loadingImageView.frame;
|
||||
[self.loadingImageView addSubview:effectView];
|
||||
|
||||
UIActivityIndicatorView *activityIndicatorView = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
|
||||
[activityIndicatorView startAnimating];
|
||||
activityIndicatorView.frame = CGRectMake(ceil(self.loadingImageView.frame.size.width * 0.5) - ceil(activityIndicatorView.frame.size.width * 0.5), ceil(self.loadingImageView.frame.size.height * 0.5) - ceil(activityIndicatorView.frame.size.height * 0.5), activityIndicatorView.frame.size.width, activityIndicatorView.frame.size.height);
|
||||
[self.loadingImageView addSubview:activityIndicatorView];
|
||||
|
||||
if (animated)
|
||||
{
|
||||
self.loadingImageView.alpha = 0.0;
|
||||
[self addSubview:self.loadingImageView];
|
||||
[UIView animateWithDuration:0.25 animations:^{
|
||||
self.loadingImageView.alpha = 1.0;
|
||||
} completion:^(BOOL finished) {
|
||||
if (callback)
|
||||
{
|
||||
callback();
|
||||
}
|
||||
}];
|
||||
}
|
||||
else
|
||||
{
|
||||
[self addSubview:self.loadingImageView];
|
||||
if (callback)
|
||||
{
|
||||
callback();
|
||||
}
|
||||
}
|
||||
}
|
||||
else // hide
|
||||
{
|
||||
if (self.loadingImageView != nil)
|
||||
{
|
||||
if (animated)
|
||||
{
|
||||
[UIView animateWithDuration:0.25 animations:^{
|
||||
self.loadingImageView.alpha = 0.0;
|
||||
} completion:^(BOOL finished) {
|
||||
[self.loadingImageView removeFromSuperview];
|
||||
if (callback)
|
||||
{
|
||||
callback();
|
||||
}
|
||||
}];
|
||||
}
|
||||
else
|
||||
{
|
||||
[self.loadingImageView removeFromSuperview];
|
||||
if (callback)
|
||||
{
|
||||
callback();
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (callback)
|
||||
{
|
||||
callback();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
- (void)setLoading:(BOOL)loading animated:(BOOL)animated
|
||||
{
|
||||
[self setLoading:loading animated:animated callback:nil];
|
||||
}
|
||||
|
||||
- (void)setLoading:(BOOL)loading
|
||||
{
|
||||
[self setLoading:loading animated:NO];
|
||||
}
|
||||
|
||||
- (void)setHeaderView:(UIView *)headerView
|
||||
{
|
||||
if (_headerView)
|
||||
|
||||
@@ -330,7 +330,7 @@ typedef NS_ENUM(NSInteger, JBLineChartViewColorStyle) {
|
||||
/**
|
||||
* Returns the selection color of a line within the chart during touch events.
|
||||
* The property showsLineSelection must be YES for the color to apply.
|
||||
* As well, lineChartView:selectionColorStyleForLineAtLineIndex: must return JBLineChartViewColorStyleSolid (default).
|
||||
* As well, lineChartView:colorStyleForLineAtLineIndex: must return JBLineChartViewColorStyleSolid (default)
|
||||
*
|
||||
* Default: matches lineChartView:colorForLineAtLineIndex:.
|
||||
*
|
||||
@@ -344,7 +344,7 @@ typedef NS_ENUM(NSInteger, JBLineChartViewColorStyle) {
|
||||
/**
|
||||
* Returns the selection gradient layer of a line within the chart during touch events.
|
||||
* The property showsLineSelection must be YES for the color to apply.
|
||||
* As well, lineChartView:selectionColorStyleForLineAtLineIndex: must return JBLineChartViewColorStyleGradient.
|
||||
* As well, lineChartView:colorStyleForLineAtLineIndex: must return JBLineChartViewColorStyleGradient.
|
||||
*
|
||||
* Note: gradients do not support multiple alphas. The alpha of gradient's first color be used throughout.
|
||||
*
|
||||
@@ -360,7 +360,7 @@ typedef NS_ENUM(NSInteger, JBLineChartViewColorStyle) {
|
||||
/**
|
||||
* Returns the selection fill color under a line within the chart during touch events.
|
||||
* The property showsLineSelection must be YES for the color to apply.
|
||||
* As well, lineChartView:selectionFillColorStyleForLineAtLineIndex: must return JBLineChartViewColorStyleSolid (default).
|
||||
* As well, lineChartView:fillColorStyleForLineAtLineIndex: must return JBLineChartViewColorStyleSolid (default).
|
||||
*
|
||||
* Default: matches lineChartView:fillColorForLineAtLineIndex:.
|
||||
*
|
||||
@@ -374,7 +374,7 @@ typedef NS_ENUM(NSInteger, JBLineChartViewColorStyle) {
|
||||
/**
|
||||
* Returns the selection fill gradient layer under a line within the chart during touch events.
|
||||
* The property showsLineSelection must be YES for the color to apply.
|
||||
* As well, lineChartView:selectionFillColorStyleForLineAtLineIndex: must return JBLineChartViewColorStyleGrdient.
|
||||
* As well, lineChartView:fillColorStyleForLineAtLineIndex: must return JBLineChartViewColorStyleGrdient.
|
||||
*
|
||||
* Note: gradients do not support multiple alphas. The alpha of gradient's first color be used throughout.
|
||||
*
|
||||
|
||||
@@ -1035,8 +1035,8 @@ static NSInteger const kJBLineChartUnselectedLineIndex = -1;
|
||||
// Touch point
|
||||
CGPoint normalizedTouchPoint = CGPointMake(point.x, self.linesView.bounds.size.height - point.y);
|
||||
|
||||
// Slope
|
||||
CGFloat lineSlope = (CGFloat)(rightPoint.y - leftPoint.y) / (CGFloat)(rightPoint.x - leftPoint.x);
|
||||
// Slope - set to zero if x coordinates are the same and would result in a NaN value
|
||||
CGFloat lineSlope = rightPoint.x != leftPoint.x ? (CGFloat)(rightPoint.y - leftPoint.y) / (CGFloat)(rightPoint.x - leftPoint.x) : 0.0f;
|
||||
|
||||
// Insersection point
|
||||
CGPoint interesectionPoint = CGPointMake(normalizedTouchPoint.x, (lineSlope * (normalizedTouchPoint.x - leftPoint.x)) + leftPoint.y);
|
||||
|
||||
+2
-2
@@ -1,6 +1,6 @@
|
||||
Pod::Spec.new do |s|
|
||||
s.name = "JBChartView"
|
||||
s.version = "3.0.5"
|
||||
s.version = "3.0.12"
|
||||
s.summary = "Jawbone's iOS-based charting library for both line and bar graphs."
|
||||
s.homepage = "https://github.com/Jawbone/JBChartView"
|
||||
|
||||
@@ -10,7 +10,7 @@ Pod::Spec.new do |s|
|
||||
s.author = { "Terry Worona" => "tworona@jawbone.com" }
|
||||
s.source = {
|
||||
:git => "https://github.com/Jawbone/JBChartView.git",
|
||||
:tag => "v3.0.5"
|
||||
:tag => "v3.0.12"
|
||||
}
|
||||
|
||||
s.platform = :ios, '6.0'
|
||||
|
||||
@@ -205,18 +205,15 @@ NSString * const kJBBarChartViewControllerNavButtonViewKey = @"view";
|
||||
|
||||
- (void)chartToggleButtonPressed:(id)sender
|
||||
{
|
||||
int randomNumber = (-3) + rand() % (3-(-3));
|
||||
UIView *buttonImageView = [self.navigationItem.rightBarButtonItem valueForKey:kJBBarChartViewControllerNavButtonViewKey];
|
||||
buttonImageView.userInteractionEnabled = NO;
|
||||
|
||||
NSMutableArray *mutableChartData = [NSMutableArray array];
|
||||
for (int i=0; i<(kJBBarChartViewControllerNumBars + randomNumber ); i++)
|
||||
{
|
||||
NSInteger delta = ((kJBBarChartViewControllerNumBars + randomNumber) - labs(((kJBBarChartViewControllerNumBars + randomNumber) - i) - i)) + 2;
|
||||
[mutableChartData addObject:[NSNumber numberWithFloat:MAX((delta * kJBBarChartViewControllerMinBarHeight), arc4random() % (delta * kJBBarChartViewControllerMaxBarHeight))]];
|
||||
|
||||
}
|
||||
self.chartData = [NSArray arrayWithArray:mutableChartData];
|
||||
CGAffineTransform transform = self.barChartView.state == JBChartViewStateExpanded ? CGAffineTransformMakeRotation(M_PI) : CGAffineTransformMakeRotation(0);
|
||||
buttonImageView.transform = transform;
|
||||
|
||||
[self.barChartView reloadDataAnimated:YES];
|
||||
[self.barChartView setState:self.barChartView.state == JBChartViewStateExpanded ? JBChartViewStateCollapsed : JBChartViewStateExpanded animated:YES callback:^{
|
||||
buttonImageView.userInteractionEnabled = YES;
|
||||
}];
|
||||
}
|
||||
|
||||
#pragma mark - Overrides
|
||||
|
||||
@@ -305,15 +305,7 @@ NSString * const kJBLineChartViewControllerNavButtonViewKey = @"view";
|
||||
|
||||
- (void)chartToggleButtonPressed:(id)sender
|
||||
{
|
||||
UIView *buttonImageView = [self.navigationItem.rightBarButtonItem valueForKey:kJBLineChartViewControllerNavButtonViewKey];
|
||||
buttonImageView.userInteractionEnabled = NO;
|
||||
|
||||
CGAffineTransform transform = self.lineChartView.state == JBChartViewStateExpanded ? CGAffineTransformMakeRotation(M_PI) : CGAffineTransformMakeRotation(0);
|
||||
buttonImageView.transform = transform;
|
||||
|
||||
[self.lineChartView setState:self.lineChartView.state == JBChartViewStateExpanded ? JBChartViewStateCollapsed : JBChartViewStateExpanded animated:YES callback:^{
|
||||
buttonImageView.userInteractionEnabled = YES;
|
||||
}];
|
||||
[self.chartView setLoading:!self.chartView.loading animated:YES];
|
||||
}
|
||||
|
||||
#pragma mark - Overrides
|
||||
|
||||
Reference in New Issue
Block a user