SwiftCharts
SwiftCharts 是一个易于使用且高度可定制的 iOS 图表库
特性
- 条形图 - 普通型,堆叠型,分组型,水平型,垂直型
- 散点图
- 线形图(直线/贝塞尔曲线/自定义路径生成器)
- 面积图
- 气泡图
- 多轴
- 蜡烛图
- 每个值可以有多个标签(x 轴)
- 所有内容均可自定义 - 颜色,视图,单位,标签,动画,交互,轴等。
- 使用简单的 UIView,轻松创建任意标记、叠加、信息视图等。
- 模块化架构,允许外部轻松创建新的图表类型或在现有类型上添加效果(无需更改库)。
- 图表可以组合使用。
- 饼图
- 图例
- 缩放和平移,可锁定到x/y轴,最大增量或两者均可。弹性效果。(未发布)
- 可扩展的轴值和标签生成器,适用于数字、日期等,具有可自定义的缩放处理(美观数字,一分为二等)。(未发布)。
这些都是独立的仓库,以便更好地集中和复用。
iOS 7+
安装
CocoaPods
添加到您的 Podfile
use_frameworks!
pod 'SwiftCharts', '~> 0.6.5'
直接使用主干
pod 'SwiftCharts', :git => 'https://github.com/i-schuetz/SwiftCharts.git'
然后
pod install
在您的代码中导入框架
import SwiftCharts
Carthage
添加到您的 Cartfile
github "i-schuetz/SwiftCharts" ~> 0.6.5
贡献
我们非常欢迎贡献!要提交一项
- Fork(分支复制)
- 在您的Fork中分支更改
- 将您的代码提交并创建一个pull request(拉取请求)
快速开始
多行图
let chartConfig = ChartConfigXY(
xAxisConfig: ChartAxisConfig(from: 2, to: 14, by: 2),
yAxisConfig: ChartAxisConfig(from: 0, to: 14, by: 2)
)
let frame = CGRect(x: 0, y: 70, width: 300, height: 500)
let chart = LineChart(
frame: frame,
chartConfig: chartConfig,
xTitle: "X axis",
yTitle: "Y axis",
lines: [
(chartPoints: [(2.0, 10.6), (4.2, 5.1), (7.3, 3.0), (8.1, 5.5), (14.0, 8.0)], color: UIColor.red),
(chartPoints: [(2.0, 2.6), (4.2, 4.1), (7.3, 1.0), (8.1, 11.5), (14.0, 3.0)], color: UIColor.blue)
]
)
self.view.addSubview(chart.view)
条形图
let chartConfig = BarsChartConfig(
valsAxisConfig: ChartAxisConfig(from: 0, to: 8, by: 2)
)
let frame = CGRect(x: 0, y: 70, width: 300, height: 500)
let chart = BarsChart(
frame: frame,
chartConfig: chartConfig,
xTitle: "X axis",
yTitle: "Y axis",
bars: [
("A", 2),
("B", 4.5),
("C", 3),
("D", 5.4),
("E", 6.8),
("F", 0.5)
],
color: UIColor.red,
barWidth: 20
)
self.view.addSubview(chart.view)
self.chart = chart
概念
-
分层架构,使其极容易自定义图表,创建新类型、组合现有类型和添加交互元素。
-
通过生成器函数创建视图,这使您在任意层中使用自定义视图变得容易。
主要组件
1. 层
图表是组合层的结果。一切都是一个层 - 轴,指导线,分隔符,线条,圆形等。这个想法是拥有松耦合的组件,可以轻松更改和组合。这是基本图表的结构示例,显示带有圆形的线条
以下是一个更底层的示例,以便深入了解层系统。注意,大多数示例都是这样写的,以便提供最大的灵活性。
let chartPoints: [ChartPoint] = [(2, 2), (4, 4), (6, 6), (8, 8), (8, 10), (15, 15)].map{ChartPoint(x: ChartAxisValueInt($0.0), y: ChartAxisValueInt($0.1))}
let labelSettings = ChartLabelSettings(font: ExamplesDefaults.labelFont)
let generator = ChartAxisGeneratorMultiplier(2)
let labelsGenerator = ChartAxisLabelsGeneratorFunc {scalar in
return ChartAxisLabel(text: "\(scalar)", settings: labelSettings)
}
let xGenerator = ChartAxisGeneratorMultiplier(2)
let xModel = ChartAxisModel(firstModelValue: 0, lastModelValue: 16, axisTitleLabels: [ChartAxisLabel(text: "Axis title", settings: labelSettings)], axisValuesGenerator: xGenerator, labelsGenerator: labelsGenerator)
let yModel = ChartAxisModel(firstModelValue: 0, lastModelValue: 16, axisTitleLabels: [ChartAxisLabel(text: "Axis title", settings: labelSettings.defaultVertical())], axisValuesGenerator: generator, labelsGenerator: labelsGenerator)
let chartFrame = ExamplesDefaults.chartFrame(view.bounds)
let chartSettings = ExamplesDefaults.chartSettingsWithPanZoom
// generate axes layers and calculate chart inner frame, based on the axis models
let coordsSpace = ChartCoordsSpaceLeftBottomSingleAxis(chartSettings: chartSettings, chartFrame: chartFrame, xModel: xModel, yModel: yModel)
let (xAxisLayer, yAxisLayer, innerFrame) = (coordsSpace.xAxisLayer, coordsSpace.yAxisLayer, coordsSpace.chartInnerFrame)
// create layer with guidelines
let guidelinesLayerSettings = ChartGuideLinesDottedLayerSettings(linesColor: UIColor.black, linesWidth: ExamplesDefaults.guidelinesWidth)
let guidelinesLayer = ChartGuideLinesDottedLayer(xAxisLayer: xAxisLayer, yAxisLayer: yAxisLayer, settings: guidelinesLayerSettings)
// view generator - this is a function that creates a view for each chartpoint
let viewGenerator = {(chartPointModel: ChartPointLayerModel, layer: ChartPointsViewsLayer, chart: Chart) -> UIView? in
let viewSize: CGFloat = Env.iPad ? 30 : 20
let center = chartPointModel.screenLoc
let label = UILabel(frame: CGRect(x: center.x - viewSize / 2, y: center.y - viewSize / 2, width: viewSize, height: viewSize))
label.backgroundColor = UIColor.green
label.textAlignment = NSTextAlignment.center
label.text = chartPointModel.chartPoint.y.description
label.font = ExamplesDefaults.labelFont
return label
}
// create layer that uses viewGenerator to display chartpoints
let chartPointsLayer = ChartPointsViewsLayer(xAxis: xAxisLayer.axis, yAxis: yAxisLayer.axis, chartPoints: chartPoints, viewGenerator: viewGenerator, mode: .translate)
// create chart instance with frame and layers
let chart = Chart(
frame: chartFrame,
innerFrame: innerFrame,
settings: chartSettings,
layers: [
xAxisLayer,
yAxisLayer,
guidelinesLayer,
chartPointsLayer
]
)
view.addSubview(chart.view)
self.chart = chart
层决定如何呈现其数据 - 这可以通过添加子视图、(CA)层、核心图形等来实现。
2. 视图生成器
基于视图的层将使用生成器函数来生成图表点视图。此函数接收每个图表点的完整状态(模型数据、屏幕位置)并生成一个UIView,允许任何类型的自定义。
你好世界
示例中包含了一个你好世界,类似于上面的代码,有一点更多的解释。更改生成视图的一些属性,复制粘贴上面代码段中使用的chartPointsLineLayer,并将其传递给图表层,以在视图后面显示线条,您就已经掌握了主要概念!
重要!
-
别忘了始终保持对图表实例的强引用,否则它将被释放,从而导致轴和标签不显示。
-
如果您图表中有许多轴标签,可能有必要在后台计算坐标空间,以避免在过渡或滚动期间可能出现的延迟。请参阅ScrollExample或MultipleAxesExample示例。
任务
SwiftCharts 现在有一些 项目 用于规划功能和改进。您可以随意抓住这些主题之一,即使是仅仅为了添加反馈。您可以为此打开一个问题。其他选项,如打开 Slack 频道,也是可能的。
创建者
伊万·施特茨
如果您需要特别的服务或只是时间紧迫,我也可以接受聘请
鸣谢
非常感谢在过去的几个月里赞助这个项目的棒的 grafiti.io,当然还要感谢所有 贡献者!
许可
SwiftCharts 版权所有 (c) 2015 伊万·施特茨,并在附带的 Apache 2.0 许可 下作为开源软件发布。
软件按“原样”提供,不提供任何明示或暗示的担保,包括但不限于适销性、适用于特定目的和不侵犯知识产权的担保。在任何情况下,作者都不应对任何索赔、损害或其他责任负责,无论这些责任是基于合同、侵权或其他,源自、因之而产生或与此软件或软件的使用或其他交易有关。
这是将 obj-c 项目移至 Swift 并(大量改进)的移植,该作品是在我受雇于 eGym GmbH 时完成的 https://github.com/egymgmbh/ios-charts