JBChartView 3.0.13

JBChartView 3.0.13

测试已测试
Lang语言 Obj-CObjective C
许可证 自定义
发布最后发布2017年2月

Maintained by Terry WoronaTerry Worona




  • By
  • Terry Worona


介绍JBChartView-基于iOS的图表库,支持折线和条形图。它易于设置,并且高度可定制。

功能

  • 支持所有设备的UIView子类。
  • 支持折线和条形图。
  • 简单易用,采用类似于UITableView的协议。
  • 高度可定制。
  • 支持扩展和折叠动画。

请参阅变更日志以了解JBChartView功能的历史概述。

要求

  • 需要iOS 6或更高版本
  • 需要自动引用计数(ARC)

演示项目

在Xcode中构建和运行JBChartViewDemo项目。演示展示了线条和条形图的使用,还概述了如何自定义图表的外观。

更多示例

  • Anscombe的Quartet:展示JBChartView在经典数据可视化示例Anscombe的Quartet中的应用。
  • Spark Friends:展示JBChartView在sparklines和(假)用户步数数据中的应用。

安装

CocoaPods是安装JBChartView的推荐方法。

CocoaPods方法

只需将以下行添加到您的Podfile

platform :ios, '6.0'
pod 'JBChartView'

旧方法

使用JBChartView与您的应用程序最简单的方法是将/Classes文件夹拖放到您的Xcode 5项目中。我们还建议您将/Classes文件夹重命名为更具有描述性的名称(例如“Jawbone - JBChartView”)。

使用方法

所有JBChartView实现都有类似于UITableView的数据源和代理模式。如果您熟悉使用UITableViewUITableViewController,那么使用JBChartView子类应该很容易!

Swift项目

要在Swift项目中使用JBCartView,请将以下内容添加到您的桥接头文件(JBChartView-Bridging-Header.h)中:

#import <UIKit/UIKit.h>
#import "JBChartView.h"
#import "JBBarChartView.h"
#import "JBLineChartView.h"

有关添加桥接头的更多信息,请参阅同一个项目中使用Swift和Objective-C

JBBarChartView

初始化一个JBBarChartView只需要几行代码(如下所示)。条形图也可以通过nibframe初始化。

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

同样,为了初始化一个JBLineChartView,您只需要几行代码(如下所示)。线形图也可以通过nibframe初始化。

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