iOS上一个简单的折线/区域图表库,使用Swift编写。
SwiftChart.zip
,并将其内容解压到项目文件夹中。库包括
示例
let chart = Chart()
let series = ChartSeries([0, 6, 2, 8, 4, 7, 3, 10, 8])
series.color = ChartColors.greenColor()
chart.add(series)
要运行示例项目,克隆仓库,首先从示例目录运行pod install
可以从Interface Builder初始化图表。将一个普通View拖动到ViewController中,并在身份检查器中将它设置为Chart
自定义类
可以从属性检查器设置图表外观的部分
要编程初始化图表,请使用Chart(frame: ...)
初始化器,它需要一个frame
let chart = Chart(frame: CGRect(x: 0, y: 0, width: 200, height: 100))
如果您想使用自动布局,请将框架设置为0
,稍后再添加约束。
let chart = Chart(frame: CGRectZero)
// add constraints now
在将系列添加到图表之前,请分别初始化它们。为此,传递一个数组来初始化一个ChartSeries
对象。
let series = ChartSeries([0, 6.5, 2, 8, 4.1, 7, -3.1, 10, 8])
chart.add(series)
默认情况下,x轴上的值是传入数组的递进索引。您可以通过向系列初始化器传递一组(x: Float, y: Float)
元组来自定义这些值。
// Create a new series specifying x and y values
let data = [(x: 0, y: 0), (x: 0.5, y: 3.1), (x: 1.2, y: 2), (x: 2.1, y: -4.2), (x: 2.6, y: 1.1)]
let series = ChartSeries(data)
chart.add(series)
使用chart.add(series: ChartSeries)
和chart.add(series: Array<ChartSeries>)
方法可以添加更多系列。这些系列将在图表的series
属性中通过递进索引来识别。
使用chart.xLabels
属性将x轴宽度设置为超过实际数据。例如,
let chart = Chart(frame: CGRect(x: 0, y: 0, width: 200, height: 100))
let data = [(x: 0.0, y: 0), (x: 3, y: 2.5), (x: 4, y: 2), (x: 5, y: 2.3), (x: 7, y: 3), (x: 8, y: 2.2), (x: 9, y: 2.5)]
let series = ChartSeries(data: data)
series.area = true
chart.xLabels = [0, 3, 6, 9, 12, 15, 18, 21, 24]
chart.xLabelsFormatter = { String(Int(round($1))) + "h" }
chart.add(series)
将渲染
要让图表响应用户触摸事件,请在您的类中实现ChartDelegate
协议,作为一个视图控制器,并设置图表的delegate
属性。
class MyViewController: UIViewController, ChartDelegate {
override func viewDidLoad() {
let chart = Chart(frame: CGRect(x: 0, y: 0, width: 100, height: 200))
chart.delegate = self
}
// Chart delegate
func didTouchChart(chart: Chart, indexes: Array<Int?>, x: Float, left: CGFloat) {
// Do something on touch
}
func didFinishTouchingChart(chart: Chart) {
// Do something when finished
}
func didEndTouchingChart(chart: Chart) {
// Do something when ending touching chart
}
}
didTouchChart
方法传递一个索引数组,每个索引对应一个系列,可选的Int
指代数据的索引。
func didTouchChart(chart: Chart, indexes: Array<Int?>, x: Float, left: CGFloat) {
for (serieIndex, dataIndex) in enumerate(indexes) {
if dataIndex != nil {
// The series at serieIndex has been touched
let value = chart.valueForSeries(serieIndex, atIndex: dataIndex)
}
}
}
您可以使用chart.valueForSeries()
来访问触摸位置对应的值。
x: Float
参数指代x轴的值:它由触摸事件的水平位置推断的,可能不是系列值的一部分。
left: CGFloat
是图表视图上的x位置,从左侧开始。它可以用于设置标签的位置,使其位于图表上方。
如果您遇到这个问题库,请在Stack Overflow上为您的问题标记swiftcharts
。
类继承自UIView
的Chart
类,所以如果图表没有显示,可能是视图大小相关的问题。检查您的视图约束,并确保在viewDidLoad
中初始化它,Uikit可以计算视图尺寸。
一些调试隐藏图表的提示
areaAlphaComponent
– 区域颜色的alpha因子。axesColor
– 轴的颜色。bottomInset
– 包含x轴标签的图表底部区域的宽度。delegate
– 监听触摸事件的委托。highlightLineColor
– 突出显示线条的颜色。highlightLineWidth
– 突出显示线条的宽度。gridColor
– 栅格颜色。labelColor
– 标签的颜色。labelFont
– 标签使用的字体。lineWidth
- 图表的线宽。maxX
- 自定义的X最大值。maxY
- 自定义的Y最大值。minX
- 最小的X值。minY
- 最小的Y值。topInset
- 图表顶部的区域高度,作为填充以留出顶部Y轴标签的空间。xLabelsFormatter
- 格式化x轴上的标签。xLabelsOrientation
- 设置x轴标签的方位为垂直或水平。xLabelsTextAlignment
- x标签的文本对齐方式。xLabelsSkipLast
(默认 true
) - 跳过最后的x标签。将其设置为 false
将会导致标签超出框架宽度,请谨慎使用!yLabelsFormatter
- 格式化y轴上的标签。yLabelsOnRightSide
– 将y标签放置在右侧。add(series: ChartSeries)
– 向图表添加一个系列。removeSeries()
– 从图表中移除所有系列。removeSeriesAtIndex(index: Int)
– 在指定索引处移除一个系列。valueForSeries()
– 获取指定系列在指定索引处的值。area
- 在系列线条下方绘制一个区域。line
- 设置为 false
来隐藏线条(用于仅绘制区域)。color
- 系列颜色。colors
- 一个元组,用于指定零以上或以下的颜色。例如,(above: ChartsColors.redColor(), below: ChartsColors.blueColor(), -4)
将在值大于 -4
时使用红色,在值小于 -4 时使用蓝色。didTouchChart
– 通知代理指定的图表已被触摸。didFinishTouchingChart
– 通知代理用户完成了图表的触摸。用户只有在向左或向右滑动图表外部时才会“完成”触摸图表。didEndTouchingChart
– 通知代理用户结束了图表的触摸。用户结束时将按顺序触摸Quando方法是调用的。SwiftChart可使用MIT许可证获得。更多信息请参阅LICENSE文件。