Skip to content

Commit 8a79e43

Browse files
committed
More interesting example for bars+line
1 parent 49b007a commit 8a79e43

File tree

7 files changed

+169
-79
lines changed

7 files changed

+169
-79
lines changed

Examples/Examples.xcodeproj/project.pbxproj

+8-4
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
EB5DB6641AFD084A00569E59 /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = EB5DB6621AFD084A00569E59 /* LaunchScreen.xib */; };
2020
EB5DB6701AFD084A00569E59 /* ExamplesTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = EB5DB66F1AFD084A00569E59 /* ExamplesTests.swift */; };
2121
EB5DB68C1AFD08AD00569E59 /* AreasExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = EB5DB67A1AFD08AD00569E59 /* AreasExample.swift */; };
22-
EB5DB68D1AFD08AD00569E59 /* BarsAndLinesExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = EB5DB67B1AFD08AD00569E59 /* BarsAndLinesExample.swift */; };
22+
EB5DB68D1AFD08AD00569E59 /* BarsPlusMinusAndLinesExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = EB5DB67B1AFD08AD00569E59 /* BarsPlusMinusAndLinesExample.swift */; };
2323
EB5DB68F1AFD08AD00569E59 /* CandleStickExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = EB5DB67D1AFD08AD00569E59 /* CandleStickExample.swift */; };
2424
EB5DB6901AFD08AD00569E59 /* CandleStickInteractiveExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = EB5DB67E1AFD08AD00569E59 /* CandleStickInteractiveExample.swift */; };
2525
EB5DB6911AFD08AD00569E59 /* CoordsExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = EB5DB67F1AFD08AD00569E59 /* CoordsExample.swift */; };
@@ -44,6 +44,7 @@
4444
EB5DC0E01B08739C001FD5A8 /* ScatterExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = EB5DC0DF1B08739C001FD5A8 /* ScatterExample.swift */; };
4545
EB5DC10F1B091FCC001FD5A8 /* ChartBarsLayer.swift in Sources */ = {isa = PBXBuildFile; fileRef = EB5DC10E1B091FCC001FD5A8 /* ChartBarsLayer.swift */; };
4646
EB5DC1111B094108001FD5A8 /* BarsPlusMinusWithGradientExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = EB5DC1101B094108001FD5A8 /* BarsPlusMinusWithGradientExample.swift */; };
47+
EB5DC1131B0A7681001FD5A8 /* HandlingLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = EB5DC1121B0A7681001FD5A8 /* HandlingLabel.swift */; };
4748
EBC533471B00F02600D10448 /* ChartAxisLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = EBC5330D1B00F02600D10448 /* ChartAxisLabel.swift */; };
4849
EBC533481B00F02600D10448 /* ChartAxisLayer.swift in Sources */ = {isa = PBXBuildFile; fileRef = EBC5330E1B00F02600D10448 /* ChartAxisLayer.swift */; };
4950
EBC533491B00F02600D10448 /* ChartAxisLayerDefault.swift in Sources */ = {isa = PBXBuildFile; fileRef = EBC5330F1B00F02600D10448 /* ChartAxisLayerDefault.swift */; };
@@ -129,7 +130,7 @@
129130
EB5DB66E1AFD084A00569E59 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
130131
EB5DB66F1AFD084A00569E59 /* ExamplesTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExamplesTests.swift; sourceTree = "<group>"; };
131132
EB5DB67A1AFD08AD00569E59 /* AreasExample.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AreasExample.swift; sourceTree = "<group>"; };
132-
EB5DB67B1AFD08AD00569E59 /* BarsAndLinesExample.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BarsAndLinesExample.swift; sourceTree = "<group>"; };
133+
EB5DB67B1AFD08AD00569E59 /* BarsPlusMinusAndLinesExample.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BarsPlusMinusAndLinesExample.swift; sourceTree = "<group>"; };
133134
EB5DB67D1AFD08AD00569E59 /* CandleStickExample.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CandleStickExample.swift; sourceTree = "<group>"; };
134135
EB5DB67E1AFD08AD00569E59 /* CandleStickInteractiveExample.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CandleStickInteractiveExample.swift; sourceTree = "<group>"; };
135136
EB5DB67F1AFD08AD00569E59 /* CoordsExample.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CoordsExample.swift; sourceTree = "<group>"; };
@@ -154,6 +155,7 @@
154155
EB5DC0DF1B08739C001FD5A8 /* ScatterExample.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ScatterExample.swift; sourceTree = "<group>"; };
155156
EB5DC10E1B091FCC001FD5A8 /* ChartBarsLayer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ChartBarsLayer.swift; sourceTree = "<group>"; };
156157
EB5DC1101B094108001FD5A8 /* BarsPlusMinusWithGradientExample.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BarsPlusMinusWithGradientExample.swift; sourceTree = "<group>"; };
158+
EB5DC1121B0A7681001FD5A8 /* HandlingLabel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HandlingLabel.swift; sourceTree = "<group>"; };
157159
EBC5330D1B00F02600D10448 /* ChartAxisLabel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ChartAxisLabel.swift; sourceTree = "<group>"; };
158160
EBC5330E1B00F02600D10448 /* ChartAxisLayer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ChartAxisLayer.swift; sourceTree = "<group>"; };
159161
EBC5330F1B00F02600D10448 /* ChartAxisLayerDefault.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ChartAxisLayerDefault.swift; sourceTree = "<group>"; };
@@ -289,7 +291,7 @@
289291
EB37D6B01AFD1AA10079438D /* Env.swift */,
290292
EB37D6AE1AFD1A670079438D /* ExamplesDefaults.swift */,
291293
EB5DB67A1AFD08AD00569E59 /* AreasExample.swift */,
292-
EB5DB67B1AFD08AD00569E59 /* BarsAndLinesExample.swift */,
294+
EB5DB67B1AFD08AD00569E59 /* BarsPlusMinusAndLinesExample.swift */,
293295
EB5DC1101B094108001FD5A8 /* BarsPlusMinusWithGradientExample.swift */,
294296
EBFA8BE31B054425008A7C36 /* BarsExample.swift */,
295297
EB5DB67D1AFD08AD00569E59 /* CandleStickExample.swift */,
@@ -425,6 +427,7 @@
425427
EBFA8BE91B065927008A7C36 /* ChartPointViewBarGreyOut.swift */,
426428
EBC533441B00F02600D10448 /* CubicLinePathGenerator.swift */,
427429
EBC533451B00F02600D10448 /* HandlingView.swift */,
430+
EB5DC1121B0A7681001FD5A8 /* HandlingLabel.swift */,
428431
EBC533461B00F02600D10448 /* StraigthLinePathGenerator.swift */,
429432
);
430433
path = Views;
@@ -559,12 +562,13 @@
559562
EBC5334D1B00F02600D10448 /* ChartAxisXLayerDefault.swift in Sources */,
560563
EBC533531B00F02600D10448 /* ChartAxisValueDate.swift in Sources */,
561564
EB5DB6931AFD08AD00569E59 /* CustomUnitsExample.swift in Sources */,
565+
EB5DC1131B0A7681001FD5A8 /* HandlingLabel.swift in Sources */,
562566
EB5DB68F1AFD08AD00569E59 /* CandleStickExample.swift in Sources */,
563567
EB5DB68C1AFD08AD00569E59 /* AreasExample.swift in Sources */,
564568
EB5DB6951AFD08AD00569E59 /* HelloWorld.swift in Sources */,
565569
EB5DC0E01B08739C001FD5A8 /* ScatterExample.swift in Sources */,
566570
EB5DC1111B094108001FD5A8 /* BarsPlusMinusWithGradientExample.swift in Sources */,
567-
EB5DB68D1AFD08AD00569E59 /* BarsAndLinesExample.swift in Sources */,
571+
EB5DB68D1AFD08AD00569E59 /* BarsPlusMinusAndLinesExample.swift in Sources */,
568572
EB5DB69C1AFD08AD00569E59 /* TargetExample.swift in Sources */,
569573
EBC533671B00F02600D10448 /* ChartLayerBase.swift in Sources */,
570574
EB5DB6901AFD08AD00569E59 /* CandleStickInteractiveExample.swift in Sources */,

Examples/Examples/DetailViewController.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ class DetailViewController: UIViewController, UISplitViewControllerDelegate {
5656
self.showExampleController(BubbleExample())
5757
case .Combination:
5858
self.setSplitSwipeEnabled(true)
59-
self.showExampleController(BarsAndLinesExample())
59+
self.showExampleController(BarsPlusMinusAndLinesExample())
6060
case .Scroll:
6161
self.setSplitSwipeEnabled(false)
6262
self.automaticallyAdjustsScrollViewInsets = false

Examples/Examples/Examples/BarsAndLinesExample.swift

-73
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,135 @@
1+
//
2+
// BarsPlusMinusAndLinesExample.swift
3+
// SwiftCharts
4+
//
5+
// Created by ischuetz on 04/05/15.
6+
// Copyright (c) 2015 ivanschuetz. All rights reserved.
7+
//
8+
9+
import UIKit
10+
11+
class BarsPlusMinusAndLinesExample: UIViewController {
12+
13+
private var chart: Chart? // arc
14+
15+
override func viewDidLoad() {
16+
17+
let labelSettings = ChartLabelSettings(font: ExamplesDefaults.labelFont)
18+
19+
let barsData: [(title: String, min: CGFloat, max: CGFloat)] = [
20+
("A", -65, 40),
21+
("B", -30, 50),
22+
("C", -40, 35),
23+
("D", -50, 40),
24+
("E", -60, 30),
25+
("F", -35, 47),
26+
("G", -30, 60),
27+
("H", -46, 48)
28+
]
29+
30+
let lineData: [(title: String, val: CGFloat)] = [
31+
("A", -10),
32+
("B", 20),
33+
("C", -20),
34+
("D", 10),
35+
("E", -20),
36+
("F", 23),
37+
("G", 10),
38+
("H", 45)
39+
]
40+
41+
let alpha: CGFloat = 0.5
42+
let posColor = UIColor.greenColor().colorWithAlphaComponent(alpha)
43+
let negColor = UIColor.redColor().colorWithAlphaComponent(alpha)
44+
let zero = ChartAxisValueFloat(0)
45+
let bars: [ChartPointsBar] = Array(enumerate(barsData)).flatMap {index, tuple in
46+
[
47+
ChartPointsBar(constant: ChartAxisValueFloat(CGFloat(index)), axisValue1: zero, axisValue2: ChartAxisValueFloat(tuple.min), bgColor: negColor),
48+
ChartPointsBar(constant: ChartAxisValueFloat(CGFloat(index)), axisValue1: zero, axisValue2: ChartAxisValueFloat(tuple.max), bgColor: posColor)
49+
]
50+
}
51+
52+
let yValues = Array(stride(from: -80, through: 80, by: 20)).map {ChartAxisValueFloat($0, labelSettings: labelSettings)}
53+
let xValues =
54+
[ChartAxisValueString(order: -1)] +
55+
Array(enumerate(barsData)).map {index, tuple in ChartAxisValueString(tuple.0, order: index, labelSettings: labelSettings)} +
56+
[ChartAxisValueString(order: barsData.count)]
57+
58+
59+
let xModel = ChartAxisModel(axisValues: xValues, axisTitleLabel: ChartAxisLabel(text: "Axis title", settings: labelSettings))
60+
let yModel = ChartAxisModel(axisValues: yValues, axisTitleLabel: ChartAxisLabel(text: "Axis title", settings: labelSettings))
61+
let chartFrame = ExamplesDefaults.chartFrame(self.view.bounds)
62+
let coordsSpace = ChartCoordsSpaceLeftBottomSingleAxis(chartSettings: ExamplesDefaults.chartSettings, chartFrame: chartFrame, xModel: xModel, yModel: yModel)
63+
let (xAxis, yAxis, innerFrame) = (coordsSpace.xAxis, coordsSpace.yAxis, coordsSpace.chartInnerFrame)
64+
65+
let barsLayer = ChartBarsLayer(xAxis: xAxis, yAxis: yAxis, innerFrame: innerFrame, bars: bars, horizontal: false, barWidth: Env.iPad ? 40 : 25)
66+
67+
// labels layer
68+
// create chartpoints for the top and bottom of the bars, where we will show the labels
69+
let labelChartPoints = bars.map {bar in
70+
ChartPoint(x: bar.constant, y: bar.axisValue2)
71+
}
72+
let formatter = NSNumberFormatter()
73+
formatter.maximumFractionDigits = 2
74+
let labelsLayer = ChartPointsViewsLayer(axisX: xAxis, axisY: yAxis, innerFrame: innerFrame, chartPoints: labelChartPoints, viewGenerator: {(chartPointModel, layer, chart) -> UIView? in
75+
let label = HandlingLabel()
76+
let posOffset: CGFloat = 10
77+
78+
let pos = chartPointModel.chartPoint.y.scalar > 0
79+
80+
let yOffset = pos ? -posOffset : posOffset
81+
label.text = "\(formatter.stringFromNumber(chartPointModel.chartPoint.y.scalar)!)%"
82+
label.font = ExamplesDefaults.labelFont
83+
label.sizeToFit()
84+
label.center = CGPointMake(chartPointModel.screenLoc.x, pos ? innerFrame.origin.y : innerFrame.origin.y + innerFrame.size.height)
85+
label.alpha = 0
86+
87+
label.movedToSuperViewHandler = {
88+
UIView.animateWithDuration(0.3, animations: {
89+
label.alpha = 1
90+
label.center.y = chartPointModel.screenLoc.y + yOffset
91+
})
92+
}
93+
return label
94+
95+
}, displayDelay: 0.5) // show after bars animation
96+
97+
// line layer
98+
let lineChartPoints = Array(enumerate(lineData)).map {index, tuple in ChartPoint(x: ChartAxisValueFloat(CGFloat(index)), y: ChartAxisValueFloat(tuple.val))}
99+
let lineModel = ChartLineModel(chartPoints: lineChartPoints, lineColor: UIColor.blackColor(), lineWidth: 2, animDuration: 0.5, animDelay: 1)
100+
let lineLayer = ChartPointsLineLayer(axisX: xAxis, axisY: yAxis, innerFrame: innerFrame, lineModels: [lineModel])
101+
102+
let circleViewGenerator = {(chartPointModel: ChartPointLayerModel, layer: ChartPointsLayer, chart: Chart) -> UIView? in
103+
let color = UIColor(red: 0.7, green: 0.7, blue: 0.7, alpha: 1)
104+
return ChartPointCircleView(center: chartPointModel.screenLoc, size: CGSizeMake(7, 7), settings: ChartPointCircleViewSettings(animDuration: 0.3, cornerRadius: 3, borderColor: color, fillColor: color))
105+
}
106+
let lineCirclesLayer = ChartPointsViewsLayer(axisX: xAxis, axisY: yAxis, innerFrame: innerFrame, chartPoints: lineChartPoints, viewGenerator: circleViewGenerator, displayDelay: 1.5, delayBetweenItems: 0.05)
107+
108+
109+
// show a gap between positive and negative bar
110+
let dummyZeroYChartPoint = ChartPoint(x: ChartAxisValueFloat(0), y: ChartAxisValueFloat(0))
111+
let yZeroGapLayer = ChartPointsViewsLayer(axisX: xAxis, axisY: yAxis, innerFrame: innerFrame, chartPoints: [dummyZeroYChartPoint], viewGenerator: {(chartPointModel, layer, chart) -> UIView? in
112+
let height: CGFloat = 2
113+
let v = UIView(frame: CGRectMake(innerFrame.origin.x + 2, chartPointModel.screenLoc.y - height / 2, innerFrame.origin.x + innerFrame.size.height, height))
114+
v.backgroundColor = UIColor.whiteColor()
115+
return v
116+
})
117+
118+
let chart = Chart(
119+
frame: chartFrame,
120+
layers: [
121+
xAxis,
122+
yAxis,
123+
barsLayer,
124+
labelsLayer,
125+
yZeroGapLayer,
126+
lineLayer,
127+
lineCirclesLayer
128+
]
129+
)
130+
131+
self.view.addSubview(chart.view)
132+
self.chart = chart
133+
}
134+
135+
}

Examples/Examples/MasterViewController.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,12 @@ class MasterViewController: UITableViewController {
2121
(.Bars, "Bars"),
2222
(.StackedBars, "Stacked bars"),
2323
(.BarsPlusMinus, "+/- bars with dynamic gradient"),
24+
(.Combination, "+/- bars and line"),
2425
(.Scatter, "Scatter"),
2526
(.Notifications, "Notifications (interactive)"),
2627
(.Target, "Target point animation"),
2728
(.Bubble, "Bubble, gradient bar mapping"),
2829
(.NotNumeric, "Not numeric values"),
29-
(.Combination, "Bars, line, circles"),
3030
(.Scroll, "Multiline, Scroll"),
3131
(.Coords, "Show touch coords (interactive)"),
3232
(.Tracker, "Track touch (interactive)"),

Screenshots/IMG_0027.jpeg

839 Bytes
Loading

SwiftCharts/Views/HandlingLabel.swift

+24
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
//
2+
// HandlingLabel.swift
3+
// Examples
4+
//
5+
// Created by ischuetz on 18/05/15.
6+
// Copyright (c) 2015 ivanschuetz. All rights reserved.
7+
//
8+
9+
import UIKit
10+
11+
// Convenience view to handle events without subclassing
12+
public class HandlingLabel: UILabel {
13+
14+
public var movedToSuperViewHandler: (() -> ())?
15+
public var touchHandler: (() -> ())?
16+
17+
override public func didMoveToSuperview() {
18+
self.movedToSuperViewHandler?()
19+
}
20+
21+
override public func touchesEnded(touches: Set<NSObject>, withEvent event: UIEvent) {
22+
self.touchHandler?()
23+
}
24+
}

0 commit comments

Comments
 (0)