测试已测试 | ✗ |
Lang语言 | Obj-CObjective C |
许可证 | 自定义 |
发布最后发布 | 2017年2月 |
Maintained by Terry Worona,Terry Worona。
介绍JBChartView-基于iOS的图表库,支持折线和条形图。它易于设置,并且高度可定制。
请参阅变更日志以了解JBChartView功能的历史概述。
在Xcode中构建和运行JBChartViewDemo项目。演示展示了线条和条形图的使用,还概述了如何自定义图表的外观。
CocoaPods是安装JBChartView的推荐方法。
只需将以下行添加到您的Podfile
platform :ios, '6.0'
pod 'JBChartView'
使用JBChartView与您的应用程序最简单的方法是将/Classes
文件夹拖放到您的Xcode 5项目中。我们还建议您将/Classes
文件夹重命名为更具有描述性的名称(例如“Jawbone - JBChartView”)。
所有JBChartView实现都有类似于UITableView
的数据源和代理模式。如果您熟悉使用UITableView
或UITableViewController
,那么使用JBChartView子类应该很容易!
要在Swift项目中使用JBCartView,请将以下内容添加到您的桥接头文件(JBChartView-Bridging-Header.h)中:
#import <UIKit/UIKit.h>
#import "JBChartView.h"
#import "JBBarChartView.h"
#import "JBLineChartView.h"
有关添加桥接头的更多信息,请参阅同一个项目中使用Swift和Objective-C。
初始化一个JBBarChartView只需要几行代码(如下所示)。条形图也可以通过nib或frame初始化。
JBBarChartView *barChartView = [[JBBarChartView alloc] init];
barChartView.dataSource = self;
barChartView.delegate = self;
[self addSubview:barChartView];
就像在UITableView
中一样,确保在dealloc
中清除这些属性。
- (void)dealloc
{
JBBarChartView *barChartView = ...; // i.e. _barChartView
barChartView.delegate = nil;
barChartView.dataSource = nil;
}
至少,您需要通知数据源图表中有多少条形。
- (NSUInteger)numberOfBarsInBarChartView:(JBBarChartView *)barChartView
{
return ...; // number of bars in chart
}
其次,您需要通知代理每个条形的长度(在整个图表中自动归一化)。
- (CGFloat)barChartView:(JBBarChartView *)barChartView heightForBarViewAtIndex:(NSUInteger)index
{
return ...; // height of bar at index
}
最后,确保您已设置条形图视图的frame并至少调用一次reloadData。
barChartView.frame = CGRectMake( ... );
[barChartView reloadData];
图表框架的后续更改不会触发reloadData;它必须在更改后直接调用,以便更改生效。
线形图和条形图都支持动画重新加载。旧数据模型与新数据模型之间的差异会被计算并适当地动画化(即在条形或线条会缩小、扩展或变形成大小)。由于Apple的Quartz Core框架的技术限制,线条的填充(包括实心和渐变)不能被动画化——它们将直接‘定位’在其余图表动画的同时。
- (void)reloadDataAnimated:(BOOL)animated;
重新加载期间的状态更改将不会生效。此外,在完成任何前一个重新加载之前,后续对reloadData:
或reloadDataAnimated:
的调用也将被忽略。最后,所有触摸事件将在加载完成后被忽略。您可以通过公开的只读属性始终检查动画的状态。
@property (nonatomic, readonly) BOOL reloading;
默认情况下,动画将在大约0.25秒内完成。动画持续时间与数据模型大小无关。
注意:以上限制仅适用于动画重新加载,因为非动画重新加载是同步的。
同样,为了初始化一个JBLineChartView,您只需要几行代码(如下所示)。线形图也可以通过nib或frame初始化。
JBLineChartView *lineChartView = [[JBLineChartView alloc] init];
lineChartView.dataSource = self;
lineChartView.delegate = self;
[self addSubview:lineChartView];
就像在UITableView
中一样,确保在dealloc
中清除这些属性。
- (void)dealloc
{
JBLineChartView *lineChartView = ...; // i.e. _lineChartView
lineChartView.delegate = nil;
lineChartView.dataSource = nil;
}
至少,您需要通知数据源图表中有多少条线以及每个线纵向的数据点。
- (NSUInteger)numberOfLinesInLineChartView:(JBLineChartView *)lineChartView
{
return ...; // number of lines in chart
}
- (NSUInteger)lineChartView:(JBLineChartView *)lineChartView numberOfVerticalValuesAtLineIndex:(NSUInteger)lineIndex
{
return ...; // number of values for a line
}
其次,您需要通知代理每个图表中信的点的y位置(在整个图表中自动归一化)。
- (CGFloat)lineChartView:(JBLineChartView *)lineChartView verticalValueForHorizontalIndex:(NSUInteger)horizontalIndex atLineIndex:(NSUInteger)lineIndex
{
return ...; // y-position (y-axis) of point at horizontalIndex (x-axis)
}
注意:您可以用CGFloat代替NAN表示缺失值。图表的线将从第一个非NAN值开始,到最后的非NAN值结束。线将在缺失NAN值之间插值(即线不会中断)。
return [[NSNumber numberWithFloat:NAN] floatValue];
最后,确保您已设置线形图视图的frame并至少调用一次reloadData。
lineChartView.frame = CGRectMake( ... );
[lineChartView reloadData];
注意:图表框架的后续更改不会触发reloadData;它必须在更改后直接调用,以便更改生效。
线形图和条形图都支持一系列强大的自定义选项。有关更多信息,请参阅此处。
默认情况下,图表的最小值和最大值等于dataSource提供的min和max。您可以通过以下方式覆盖任一值:
- (void)setMinimumValue:(CGFloat)minimumValue;
- (void)setMaximumValue:(CGFloat)maximumValue;
如果提供了值,则必须 >= 0,否则将抛出断言异常。要将值重置为其原始默认值,请参考下面的说明。
- (void)resetMinimumValue;
- (void)resetMaximumValue;
min/max值被限制在图表数据源的实际min/max值的上限和下限内;例如,如果提供了最大值20,而图表的实际最大值是100,则将使用100。为了使min/max修改生效,必须调用reloadData方法。
图表的本质是显示所有可用信息,与能缓存屏幕外行的UITableView不同。当数据点的数量超过设备的分辨率时,JBChartView的性能会受到影响。同样,在MKMapView中,当在一定的地理区域内提供数百个标记时,也存在相同的问题。这也是为什么Apple建议使用聚类来避免性能问题。因此,对于大数据集,我们建议您的dataSource提供点的子集;将相近的点进行聚类。
在Apache License (v2.0)下提供使用。有关详细内容,请参阅LICENSE。