ChartsDemo-iOS/Swift/DemoBaseViewController.swift (285 lines of code) (raw):
//
// DemoBaseViewController.swift
// ChartsDemo-iOS
//
// Created by Jacob Christie on 2017-07-03.
// Copyright © 2017 jc. All rights reserved.
//
#if canImport(UIKit)
import UIKit
#endif
import Charts
enum Option {
case toggleValues
case toggleIcons
case toggleHighlight
case animateX
case animateY
case animateXY
case saveToGallery
case togglePinchZoom
case toggleAutoScaleMinMax
case toggleData
case toggleBarBorders
// LineChart
case toggleGradientLine
// CandleChart
case toggleShadowColorSameAsCandle
case toggleShowCandleBar
// CombinedChart
case toggleLineValues
case toggleBarValues
case removeDataSet
// CubicLineSampleFillFormatter
case toggleFilled
case toggleCircles
case toggleCubic
case toggleHorizontalCubic
case toggleStepped
// HalfPieChartController
case toggleXValues
case togglePercent
case toggleHole
case spin
case drawCenter
case toggleLabelsMinimumAngle
// RadarChart
case toggleXLabels
case toggleYLabels
case toggleRotate
case toggleHighlightCircle
var label: String {
switch self {
case .toggleValues: return "Toggle Y-Values"
case .toggleIcons: return "Toggle Icons"
case .toggleHighlight: return "Toggle Highlight"
case .animateX: return "Animate X"
case .animateY: return "Animate Y"
case .animateXY: return "Animate XY"
case .saveToGallery: return "Save to Camera Roll"
case .togglePinchZoom: return "Toggle PinchZoom"
case .toggleAutoScaleMinMax: return "Toggle auto scale min/max"
case .toggleData: return "Toggle Data"
case .toggleBarBorders: return "Toggle Bar Borders"
// LineChart
case .toggleGradientLine: return "Toggle Gradient Line"
// CandleChart
case .toggleShadowColorSameAsCandle: return "Toggle shadow same color"
case .toggleShowCandleBar: return "Toggle show candle bar"
// CombinedChart
case .toggleLineValues: return "Toggle Line Values"
case .toggleBarValues: return "Toggle Bar Values"
case .removeDataSet: return "Remove Random Set"
// CubicLineSampleFillFormatter
case .toggleFilled: return "Toggle Filled"
case .toggleCircles: return "Toggle Circles"
case .toggleCubic: return "Toggle Cubic"
case .toggleHorizontalCubic: return "Toggle Horizontal Cubic"
case .toggleStepped: return "Toggle Stepped"
// HalfPieChartController
case .toggleXValues: return "Toggle X-Values"
case .togglePercent: return "Toggle Percent"
case .toggleHole: return "Toggle Hole"
case .spin: return "Spin"
case .drawCenter: return "Draw CenterText"
case .toggleLabelsMinimumAngle: return "Toggle Labels Minimum Angle"
// RadarChart
case .toggleXLabels: return "Toggle X-Labels"
case .toggleYLabels: return "Toggle Y-Labels"
case .toggleRotate: return "Toggle Rotate"
case .toggleHighlightCircle: return "Toggle highlight circle"
}
}
}
class DemoBaseViewController: UIViewController, ChartViewDelegate {
private var optionsTableView: UITableView? = nil
let parties = ["Party A", "Party B", "Party C", "Party D", "Party E", "Party F",
"Party G", "Party H", "Party I", "Party J", "Party K", "Party L",
"Party M", "Party N", "Party O", "Party P", "Party Q", "Party R",
"Party S", "Party T", "Party U", "Party V", "Party W", "Party X",
"Party Y", "Party Z"]
@IBOutlet weak var optionsButton: UIButton!
var options: [Option]!
var shouldHideData: Bool = false
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
self.initialize()
}
override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {
super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
self.initialize()
}
private func initialize() {
self.edgesForExtendedLayout = []
}
func optionTapped(_ option: Option) {}
func handleOption(_ option: Option, forChartView chartView: ChartViewBase) {
switch option {
case .toggleValues:
for set in chartView.data! {
set.drawValuesEnabled = !set.drawValuesEnabled
}
chartView.setNeedsDisplay()
case .toggleIcons:
for set in chartView.data! {
set.drawIconsEnabled = !set.drawIconsEnabled
}
chartView.setNeedsDisplay()
case .toggleHighlight:
chartView.data!.isHighlightEnabled = !chartView.data!.isHighlightEnabled
chartView.setNeedsDisplay()
case .animateX:
chartView.animate(xAxisDuration: 3)
case .animateY:
chartView.animate(yAxisDuration: 3)
case .animateXY:
chartView.animate(xAxisDuration: 3, yAxisDuration: 3)
case .saveToGallery:
UIImageWriteToSavedPhotosAlbum(chartView.getChartImage(transparent: false)!, nil, nil, nil)
case .togglePinchZoom:
let barLineChart = chartView as! BarLineChartViewBase
barLineChart.pinchZoomEnabled = !barLineChart.pinchZoomEnabled
chartView.setNeedsDisplay()
case .toggleAutoScaleMinMax:
let barLineChart = chartView as! BarLineChartViewBase
barLineChart.autoScaleMinMaxEnabled = !barLineChart.isAutoScaleMinMaxEnabled
chartView.notifyDataSetChanged()
case .toggleData:
shouldHideData = !shouldHideData
updateChartData()
case .toggleBarBorders:
for set in chartView.data! {
if let set = set as? BarChartDataSet {
set.barBorderWidth = set.barBorderWidth == 1.0 ? 0.0 : 1.0
}
}
chartView.setNeedsDisplay()
default:
break
}
}
@IBAction func optionsButtonTapped(_ sender: Any) {
if let optionsTableView = self.optionsTableView {
optionsTableView.removeFromSuperview()
self.optionsTableView = nil
return
}
let optionsTableView = UITableView()
optionsTableView.backgroundColor = UIColor(white: 0, alpha: 0.9)
optionsTableView.delegate = self
optionsTableView.dataSource = self
optionsTableView.translatesAutoresizingMaskIntoConstraints = false
self.optionsTableView = optionsTableView
var constraints = [NSLayoutConstraint]()
constraints.append(NSLayoutConstraint(item: optionsTableView,
attribute: .leading,
relatedBy: .equal,
toItem: self.view,
attribute: .leading,
multiplier: 1,
constant: 40))
constraints.append(NSLayoutConstraint(item: optionsTableView,
attribute: .trailing,
relatedBy: .equal,
toItem: sender as! UIView,
attribute: .trailing,
multiplier: 1,
constant: 0))
constraints.append(NSLayoutConstraint(item: optionsTableView,
attribute: .top,
relatedBy: .equal,
toItem: sender,
attribute: .bottom,
multiplier: 1,
constant: 5))
self.view.addSubview(optionsTableView)
constraints.forEach { $0.isActive = true }
let constraint = NSLayoutConstraint(item: optionsTableView,
attribute: .height,
relatedBy: .equal,
toItem: nil,
attribute: .height,
multiplier: 1,
constant: 220)
constraint.isActive = true
}
func updateChartData() {
fatalError("updateChartData not overridden")
}
func setup(pieChartView chartView: PieChartView) {
chartView.usePercentValuesEnabled = true
chartView.drawSlicesUnderHoleEnabled = false
chartView.holeRadiusPercent = 0.58
chartView.transparentCircleRadiusPercent = 0.61
chartView.chartDescription.enabled = false
chartView.setExtraOffsets(left: 5, top: 10, right: 5, bottom: 5)
chartView.drawCenterTextEnabled = true
let paragraphStyle = NSParagraphStyle.default.mutableCopy() as! NSMutableParagraphStyle
paragraphStyle.lineBreakMode = .byTruncatingTail
paragraphStyle.alignment = .center
let centerText = NSMutableAttributedString(string: "Charts\nby Daniel Cohen Gindi")
centerText.setAttributes([.font : UIFont(name: "HelveticaNeue-Light", size: 13)!,
.paragraphStyle : paragraphStyle], range: NSRange(location: 0, length: centerText.length))
centerText.addAttributes([.font : UIFont(name: "HelveticaNeue-Light", size: 11)!,
.foregroundColor : UIColor.gray], range: NSRange(location: 10, length: centerText.length - 10))
centerText.addAttributes([.font : UIFont(name: "HelveticaNeue-Light", size: 11)!,
.foregroundColor : UIColor(red: 51/255, green: 181/255, blue: 229/255, alpha: 1)], range: NSRange(location: centerText.length - 19, length: 19))
chartView.centerAttributedText = centerText;
chartView.drawHoleEnabled = true
chartView.rotationAngle = 0
chartView.rotationEnabled = true
chartView.highlightPerTapEnabled = true
let l = chartView.legend
l.horizontalAlignment = .right
l.verticalAlignment = .top
l.orientation = .vertical
l.drawInside = false
l.xEntrySpace = 7
l.yEntrySpace = 0
l.yOffset = 0
// chartView.legend = l
}
func setup(radarChartView chartView: RadarChartView) {
chartView.chartDescription.enabled = false
}
func setup(barLineChartView chartView: BarLineChartViewBase) {
chartView.chartDescription.enabled = false
chartView.dragEnabled = true
chartView.setScaleEnabled(true)
chartView.pinchZoomEnabled = false
// ChartYAxis *leftAxis = chartView.leftAxis;
let xAxis = chartView.xAxis
xAxis.labelPosition = .bottom
chartView.rightAxis.enabled = false
}
// TODO: Cannot override from extensions
//extension DemoBaseViewController: ChartViewDelegate {
func chartValueSelected(_ chartView: ChartViewBase, entry: ChartDataEntry, highlight: Highlight) {
NSLog("chartValueSelected");
}
func chartValueNothingSelected(_ chartView: ChartViewBase) {
NSLog("chartValueNothingSelected");
}
func chartScaled(_ chartView: ChartViewBase, scaleX: CGFloat, scaleY: CGFloat) {
}
func chartTranslated(_ chartView: ChartViewBase, dX: CGFloat, dY: CGFloat) {
}
}
extension DemoBaseViewController: UITableViewDelegate, UITableViewDataSource {
func numberOfSections(in tableView: UITableView) -> Int {
if optionsTableView != nil {
return 1
}
return 0
}
@available(iOS 2.0, *)
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if optionsTableView != nil {
return options.count
}
return 0
}
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
if optionsTableView != nil {
return 40.0;
}
return 44.0;
}
@available(iOS 2.0, *)
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
var cell = tableView.dequeueReusableCell(withIdentifier: "Cell")
if cell == nil {
cell = UITableViewCell(style: .default, reuseIdentifier: "Cell")
cell?.backgroundView = nil
cell?.backgroundColor = .clear
cell?.textLabel?.textColor = .white
}
cell?.textLabel?.text = self.options[indexPath.row].label
return cell!
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
if optionsTableView != nil {
tableView.deselectRow(at: indexPath, animated: true)
optionsTableView?.removeFromSuperview()
self.optionsTableView = nil
self.optionTapped(self.options[indexPath.row])
}
}
}