// // 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.. 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() } }