CoordsExample.swift 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. //
  2. // CoordsExample.swift
  3. // SwiftCharts
  4. //
  5. // Created by ischuetz on 04/05/15.
  6. // Copyright (c) 2015 ivanschuetz. All rights reserved.
  7. //
  8. import UIKit
  9. import SwiftCharts
  10. class CoordsExample: UIViewController {
  11. fileprivate var chart: Chart? // arc
  12. override func viewDidLoad() {
  13. super.viewDidLoad()
  14. let labelSettings = ChartLabelSettings(font: ExamplesDefaults.labelFont)
  15. let chartPoints = [(2, 2), (3, 1), (5, 9), (6, 7), (8, 10), (9, 9), (10, 15), (13, 8), (15, 20), (16, 17)].map{ChartPoint(x: ChartAxisValueInt($0.0), y: ChartAxisValueInt($0.1))}
  16. let xValues = ChartAxisValuesStaticGenerator.generateXAxisValuesWithChartPoints(chartPoints, minSegmentCount: 7, maxSegmentCount: 7, multiple: 2, axisValueGenerator: {ChartAxisValueDouble($0, labelSettings: labelSettings)}, addPaddingSegmentIfEdge: false)
  17. let yValues = ChartAxisValuesStaticGenerator.generateYAxisValuesWithChartPoints(chartPoints, minSegmentCount: 10, maxSegmentCount: 20, multiple: 2, axisValueGenerator: {ChartAxisValueDouble($0, labelSettings: labelSettings)}, addPaddingSegmentIfEdge: true)
  18. let xModel = ChartAxisModel(axisValues: xValues, axisTitleLabel: ChartAxisLabel(text: "Axis title", settings: labelSettings))
  19. let yModel = ChartAxisModel(axisValues: yValues, axisTitleLabel: ChartAxisLabel(text: "Axis title", settings: labelSettings.defaultVertical()))
  20. let chartFrame = ExamplesDefaults.chartFrame(view.bounds)
  21. var chartSettings = ExamplesDefaults.chartSettings // for now no zooming and panning here until ChartShowCoordsLinesLayer is improved to not scale the lines during zooming.
  22. chartSettings.trailing = 20
  23. chartSettings.labelsToAxisSpacingX = 15
  24. chartSettings.labelsToAxisSpacingY = 15
  25. let coordsSpace = ChartCoordsSpaceLeftBottomSingleAxis(chartSettings: chartSettings, chartFrame: chartFrame, xModel: xModel, yModel: yModel)
  26. let (xAxisLayer, yAxisLayer, innerFrame) = (coordsSpace.xAxisLayer, coordsSpace.yAxisLayer, coordsSpace.chartInnerFrame)
  27. let labelWidth: CGFloat = 70
  28. let labelHeight: CGFloat = 30
  29. let showCoordsTextViewsGenerator = {(chartPointModel: ChartPointLayerModel, layer: ChartPointsLayer, chart: Chart) -> UIView? in
  30. let (chartPoint, screenLoc) = (chartPointModel.chartPoint, chartPointModel.screenLoc)
  31. let text = chartPoint.description
  32. let font = ExamplesDefaults.labelFont
  33. let x = min(screenLoc.x + 5, chart.bounds.width - text.width(font) - 5)
  34. let view = UIView(frame: CGRect(x: x, y: screenLoc.y - labelHeight, width: labelWidth, height: labelHeight))
  35. let label = UILabel(frame: view.bounds)
  36. label.text = text
  37. label.font = ExamplesDefaults.labelFont
  38. view.addSubview(label)
  39. view.alpha = 0
  40. UIView.animate(withDuration: 0.2, delay: 0, options: .curveEaseOut, animations: {
  41. view.alpha = 1
  42. }, completion: nil)
  43. return view
  44. }
  45. let showCoordsLinesLayer = ChartShowCoordsLinesLayer<ChartPoint>(xAxis: xAxisLayer.axis, yAxis: yAxisLayer.axis, chartPoints: chartPoints)
  46. let showCoordsTextLayer = ChartPointsSingleViewLayer<ChartPoint, UIView>(xAxis: xAxisLayer.axis, yAxis: yAxisLayer.axis, innerFrame: innerFrame, chartPoints: chartPoints, viewGenerator: showCoordsTextViewsGenerator, mode: .custom, keepOnFront: true)
  47. // To preserve the offset of the notification views from the chart point they represent, during transforms, we need to pass mode: .custom along with this custom transformer.
  48. showCoordsTextLayer.customTransformer = {(model, view, layer) -> Void in
  49. guard let chart = layer.chart else {return}
  50. let text = model.chartPoint.description
  51. let screenLoc = layer.modelLocToScreenLoc(x: model.chartPoint.x.scalar, y: model.chartPoint.y.scalar)
  52. let x = min(screenLoc.x + 5, chart.bounds.width - text.width(ExamplesDefaults.labelFont) - 5)
  53. view.frame.origin = CGPoint(x: x, y: screenLoc.y - labelHeight)
  54. }
  55. let touchViewsGenerator = {(chartPointModel: ChartPointLayerModel, layer: ChartPointsLayer, chart: Chart) -> UIView? in
  56. let (chartPoint, screenLoc) = (chartPointModel.chartPoint, chartPointModel.screenLoc)
  57. let s: CGFloat = 30
  58. let view = HandlingView(frame: CGRect(x: screenLoc.x - s/2, y: screenLoc.y - s/2, width: s, height: s))
  59. view.touchHandler = {[weak showCoordsLinesLayer, weak showCoordsTextLayer, weak chartPoint, weak chart] in
  60. guard let chartPoint = chartPoint, let chart = chart else {return}
  61. showCoordsLinesLayer?.showChartPointLines(chartPoint, chart: chart)
  62. showCoordsTextLayer?.showView(chartPoint: chartPoint, chart: chart)
  63. }
  64. return view
  65. }
  66. let touchLayer = ChartPointsViewsLayer(xAxis: xAxisLayer.axis, yAxis: yAxisLayer.axis, chartPoints: chartPoints, viewGenerator: touchViewsGenerator, mode: .translate, keepOnFront: true)
  67. let lineModel = ChartLineModel(chartPoints: chartPoints, lineColor: UIColor(red: 0.4, green: 0.4, blue: 1, alpha: 0.2), lineWidth: 3, animDuration: 0.7, animDelay: 0)
  68. let chartPointsLineLayer = ChartPointsLineLayer(xAxis: xAxisLayer.axis, yAxis: yAxisLayer.axis, lineModels: [lineModel])
  69. let circleViewGenerator = {(chartPointModel: ChartPointLayerModel, layer: ChartPointsLayer, chart: Chart) -> UIView? in
  70. let circleView = ChartPointEllipseView(center: chartPointModel.screenLoc, diameter: 24)
  71. circleView.animDuration = 1.5
  72. circleView.fillColor = UIColor.white
  73. circleView.borderWidth = 5
  74. circleView.borderColor = UIColor.blue
  75. return circleView
  76. }
  77. let chartPointsCircleLayer = ChartPointsViewsLayer(xAxis: xAxisLayer.axis, yAxis: yAxisLayer.axis, chartPoints: chartPoints, viewGenerator: circleViewGenerator, displayDelay: 0, delayBetweenItems: 0.05, mode: .translate)
  78. let settings = ChartGuideLinesDottedLayerSettings(linesColor: UIColor.black, linesWidth: ExamplesDefaults.guidelinesWidth)
  79. let guidelinesLayer = ChartGuideLinesDottedLayer(xAxisLayer: xAxisLayer, yAxisLayer: yAxisLayer, settings: settings)
  80. let chart = Chart(
  81. frame: chartFrame,
  82. innerFrame: innerFrame,
  83. settings: chartSettings,
  84. layers: [
  85. xAxisLayer,
  86. yAxisLayer,
  87. guidelinesLayer,
  88. showCoordsLinesLayer,
  89. chartPointsLineLayer,
  90. chartPointsCircleLayer,
  91. showCoordsTextLayer,
  92. touchLayer,
  93. ]
  94. )
  95. view.addSubview(chart.view)
  96. self.chart = chart
  97. }
  98. }