123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216 |
- //
- // LineChart1ViewController.swift
- // ChartsDemo-iOS
- //
- // Created by Jacob Christie on 2017-07-09.
- // Copyright © 2017 jc. All rights reserved.
- //
- import UIKit
- import Charts
- class LineChart1ViewController: DemoBaseViewController {
- @IBOutlet var chartView: LineChartView!
- @IBOutlet var sliderX: UISlider!
- @IBOutlet var sliderY: UISlider!
- @IBOutlet var sliderTextX: UITextField!
- @IBOutlet var sliderTextY: UITextField!
- override func viewDidLoad() {
- super.viewDidLoad()
- // Do any additional setup after loading the view.
- self.title = "Line Chart 1"
- self.options = [.toggleValues,
- .toggleFilled,
- .toggleCircles,
- .toggleCubic,
- .toggleHorizontalCubic,
- .toggleIcons,
- .toggleStepped,
- .toggleHighlight,
- .toggleGradientLine,
- .animateX,
- .animateY,
- .animateXY,
- .saveToGallery,
- .togglePinchZoom,
- .toggleAutoScaleMinMax,
- .toggleData]
- chartView.delegate = self
- chartView.chartDescription.enabled = false
- chartView.dragEnabled = true
- chartView.setScaleEnabled(true)
- chartView.pinchZoomEnabled = true
- // x-axis limit line
- let llXAxis = ChartLimitLine(limit: 10, label: "Index 10")
- llXAxis.lineWidth = 4
- llXAxis.lineDashLengths = [10, 10, 0]
- llXAxis.labelPosition = .rightBottom
- llXAxis.valueFont = .systemFont(ofSize: 10)
- chartView.xAxis.gridLineDashLengths = [10, 10]
- chartView.xAxis.gridLineDashPhase = 0
- let ll1 = ChartLimitLine(limit: 150, label: "Upper Limit")
- ll1.lineWidth = 4
- ll1.lineDashLengths = [5, 5]
- ll1.labelPosition = .rightTop
- ll1.valueFont = .systemFont(ofSize: 10)
- let ll2 = ChartLimitLine(limit: -30, label: "Lower Limit")
- ll2.lineWidth = 4
- ll2.lineDashLengths = [5,5]
- ll2.labelPosition = .rightBottom
- ll2.valueFont = .systemFont(ofSize: 10)
- let leftAxis = chartView.leftAxis
- leftAxis.removeAllLimitLines()
- leftAxis.addLimitLine(ll1)
- leftAxis.addLimitLine(ll2)
- leftAxis.axisMaximum = 200
- leftAxis.axisMinimum = -50
- leftAxis.gridLineDashLengths = [5, 5]
- leftAxis.drawLimitLinesBehindDataEnabled = true
- chartView.rightAxis.enabled = false
- //[_chartView.viewPortHandler setMaximumScaleY: 2.f];
- //[_chartView.viewPortHandler setMaximumScaleX: 2.f];
- let marker = BalloonMarker(color: UIColor(white: 180/255, alpha: 1),
- font: .systemFont(ofSize: 12),
- textColor: .white,
- insets: UIEdgeInsets(top: 8, left: 8, bottom: 20, right: 8))
- marker.chartView = chartView
- marker.minimumSize = CGSize(width: 80, height: 40)
- chartView.marker = marker
- chartView.legend.form = .line
- sliderX.value = 45
- sliderY.value = 100
- slidersValueChanged(nil)
- chartView.animate(xAxisDuration: 2.5)
- }
- override func updateChartData() {
- if self.shouldHideData {
- chartView.data = nil
- return
- }
- self.setDataCount(Int(sliderX.value), range: UInt32(sliderY.value))
- }
- func setDataCount(_ count: Int, range: UInt32) {
- let values = (0..<count).map { (i) -> ChartDataEntry in
- let val = Double(arc4random_uniform(range) + 3)
- return ChartDataEntry(x: Double(i), y: val, icon: #imageLiteral(resourceName: "icon"))
- }
- let set1 = LineChartDataSet(entries: values, label: "DataSet 1")
- set1.drawIconsEnabled = false
- setup(set1)
- let value = ChartDataEntry(x: Double(3), y: 3)
- set1.addEntryOrdered(value)
- let gradientColors = [ChartColorTemplates.colorFromString("#00ff0000").cgColor,
- ChartColorTemplates.colorFromString("#ffff0000").cgColor]
- let gradient = CGGradient(colorsSpace: nil, colors: gradientColors as CFArray, locations: nil)!
- set1.fillAlpha = 1
- set1.fill = LinearGradientFill(gradient: gradient, angle: 90)
- set1.drawFilledEnabled = true
- let data = LineChartData(dataSet: set1)
- chartView.data = data
- }
- private func setup(_ dataSet: LineChartDataSet) {
- if dataSet.isDrawLineWithGradientEnabled {
- dataSet.lineDashLengths = nil
- dataSet.highlightLineDashLengths = nil
- dataSet.setColors(.black, .red, .white)
- dataSet.setCircleColor(.black)
- dataSet.gradientPositions = [0, 40, 100]
- dataSet.lineWidth = 1
- dataSet.circleRadius = 3
- dataSet.drawCircleHoleEnabled = false
- dataSet.valueFont = .systemFont(ofSize: 9)
- dataSet.formLineDashLengths = nil
- dataSet.formLineWidth = 1
- dataSet.formSize = 15
- } else {
- dataSet.lineDashLengths = [5, 2.5]
- dataSet.highlightLineDashLengths = [5, 2.5]
- dataSet.setColor(.black)
- dataSet.setCircleColor(.black)
- dataSet.gradientPositions = nil
- dataSet.lineWidth = 1
- dataSet.circleRadius = 3
- dataSet.drawCircleHoleEnabled = false
- dataSet.valueFont = .systemFont(ofSize: 9)
- dataSet.formLineDashLengths = [5, 2.5]
- dataSet.formLineWidth = 1
- dataSet.formSize = 15
- }
- }
- override func optionTapped(_ option: Option) {
- guard let data = chartView.data else { return }
- switch option {
- case .toggleFilled:
- for case let set as LineChartDataSet in data {
- set.drawFilledEnabled = !set.drawFilledEnabled
- }
- chartView.setNeedsDisplay()
- case .toggleCircles:
- for case let set as LineChartDataSet in data {
- set.drawCirclesEnabled = !set.drawCirclesEnabled
- }
- chartView.setNeedsDisplay()
- case .toggleCubic:
- for case let set as LineChartDataSet in data {
- set.mode = (set.mode == .cubicBezier) ? .linear : .cubicBezier
- }
- chartView.setNeedsDisplay()
- case .toggleStepped:
- for case let set as LineChartDataSet in data {
- set.mode = (set.mode == .stepped) ? .linear : .stepped
- }
- chartView.setNeedsDisplay()
- case .toggleHorizontalCubic:
- for case let set as LineChartDataSet in data {
- set.mode = (set.mode == .cubicBezier) ? .horizontalBezier : .cubicBezier
- }
- chartView.setNeedsDisplay()
- case .toggleGradientLine:
- for set in chartView.data!.dataSets as! [LineChartDataSet] {
- set.isDrawLineWithGradientEnabled = !set.isDrawLineWithGradientEnabled
- setup(set)
- }
- chartView.setNeedsDisplay()
- default:
- super.handleOption(option, forChartView: chartView)
- }
- }
- @IBAction func slidersValueChanged(_ sender: Any?) {
- sliderTextX.text = "\(Int(sliderX.value))"
- sliderTextY.text = "\(Int(sliderY.value))"
- self.updateChartData()
- }
- }
|