Mercurial > public > stock-charts
annotate Sources/StockCharts/LineChart/Helpers/LineView.swift @ 108:f53d8b9ca92b
Custom style implemented
author | Dennis Concepción Martín <dennisconcepcionmartin@gmail.com> |
---|---|
date | Sun, 04 Jul 2021 16:40:24 +0100 |
parents | 0c0d38dca6d8 |
children | 5057c45046c1 |
rev | line source |
---|---|
5
f828c7c408d4
Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff
changeset
|
1 // |
f828c7c408d4
Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff
changeset
|
2 // LineView.swift |
21
5135ff3343ae
Rename project to StockCharts
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
20
diff
changeset
|
3 // StockCharts |
5
f828c7c408d4
Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff
changeset
|
4 // |
21
5135ff3343ae
Rename project to StockCharts
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
20
diff
changeset
|
5 // Created by Dennis Concepción Martín on 30/4/21. |
5
f828c7c408d4
Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff
changeset
|
6 // |
f828c7c408d4
Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff
changeset
|
7 |
f828c7c408d4
Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff
changeset
|
8 import SwiftUI |
f828c7c408d4
Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff
changeset
|
9 |
18
136de51a74f2
Change struct to public
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
14
diff
changeset
|
10 public struct LineView: View { |
24
127af64e264e
Change var to public var
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
21
diff
changeset
|
11 public var data: [Double] |
127af64e264e
Change var to public var
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
21
diff
changeset
|
12 public var dates: [String]? |
127af64e264e
Change var to public var
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
21
diff
changeset
|
13 public var hours: [String]? |
60
e16e6bdaa31d
Add dragGesture argument
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
24
diff
changeset
|
14 public var dragGesture: Bool? |
108
f53d8b9ca92b
Custom style implemented
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
106
diff
changeset
|
15 public var style: LineChartStyle |
8
959175ee5ebd
Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
5
diff
changeset
|
16 |
959175ee5ebd
Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
5
diff
changeset
|
17 @Binding var showingIndicators: Bool |
959175ee5ebd
Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
5
diff
changeset
|
18 @Binding var indexPosition: Int |
20
24dfde3727c1
Make variables and structures public
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
18
diff
changeset
|
19 @State var IndicatorPointPosition: CGPoint = .zero |
24dfde3727c1
Make variables and structures public
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
18
diff
changeset
|
20 @State var pathPoints = [CGPoint]() |
5
f828c7c408d4
Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff
changeset
|
21 |
18
136de51a74f2
Change struct to public
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
14
diff
changeset
|
22 public var body: some View { |
21
5135ff3343ae
Rename project to StockCharts
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
20
diff
changeset
|
23 ZStack { |
8
959175ee5ebd
Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
5
diff
changeset
|
24 GeometryReader { proxy in |
959175ee5ebd
Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
5
diff
changeset
|
25 LinePath(data: data, width: proxy.size.width, height: proxy.size.height, pathPoints: $pathPoints) |
959175ee5ebd
Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
5
diff
changeset
|
26 .stroke(colorLine(), lineWidth: 2) |
959175ee5ebd
Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
5
diff
changeset
|
27 } |
959175ee5ebd
Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
5
diff
changeset
|
28 |
959175ee5ebd
Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
5
diff
changeset
|
29 if showingIndicators { |
108
f53d8b9ca92b
Custom style implemented
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
106
diff
changeset
|
30 IndicatorPoint(style: style) |
8
959175ee5ebd
Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
5
diff
changeset
|
31 .position(x: IndicatorPointPosition.x, y: IndicatorPointPosition.y) |
959175ee5ebd
Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
5
diff
changeset
|
32 } |
5
f828c7c408d4
Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff
changeset
|
33 } |
8
959175ee5ebd
Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
5
diff
changeset
|
34 .rotationEffect(.degrees(180), anchor: .center) |
959175ee5ebd
Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
5
diff
changeset
|
35 .rotation3DEffect(.degrees(180), axis: (x: 0.0, y: 1.0, z: 0.0)) |
959175ee5ebd
Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
5
diff
changeset
|
36 .contentShape(Rectangle()) // Control tappable area |
60
e16e6bdaa31d
Add dragGesture argument
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
24
diff
changeset
|
37 .gesture(dragGesture ?? true ? |
8
959175ee5ebd
Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
5
diff
changeset
|
38 LongPressGesture(minimumDuration: 0.2) |
959175ee5ebd
Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
5
diff
changeset
|
39 .sequenced(before: DragGesture(minimumDistance: 0, coordinateSpace: .local)) |
959175ee5ebd
Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
5
diff
changeset
|
40 .onChanged({ value in // Get value of the gesture |
959175ee5ebd
Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
5
diff
changeset
|
41 switch value { |
959175ee5ebd
Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
5
diff
changeset
|
42 case .second(true, let drag): |
959175ee5ebd
Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
5
diff
changeset
|
43 if let longPressLocation = drag?.location { |
959175ee5ebd
Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
5
diff
changeset
|
44 dragGesture(longPressLocation) |
959175ee5ebd
Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
5
diff
changeset
|
45 } |
959175ee5ebd
Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
5
diff
changeset
|
46 default: |
959175ee5ebd
Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
5
diff
changeset
|
47 break |
959175ee5ebd
Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
5
diff
changeset
|
48 } |
959175ee5ebd
Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
5
diff
changeset
|
49 }) |
959175ee5ebd
Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
5
diff
changeset
|
50 // Hide indicator when finish |
959175ee5ebd
Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
5
diff
changeset
|
51 .onEnded({ value in |
959175ee5ebd
Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
5
diff
changeset
|
52 self.showingIndicators = false |
959175ee5ebd
Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
5
diff
changeset
|
53 }) |
60
e16e6bdaa31d
Add dragGesture argument
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
24
diff
changeset
|
54 : nil // On dragGesture = false |
8
959175ee5ebd
Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
5
diff
changeset
|
55 ) |
5
f828c7c408d4
Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff
changeset
|
56 } |
f828c7c408d4
Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff
changeset
|
57 |
f828c7c408d4
Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff
changeset
|
58 /* |
f828c7c408d4
Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff
changeset
|
59 Color path depending on data. |
f828c7c408d4
Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff
changeset
|
60 */ |
20
24dfde3727c1
Make variables and structures public
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
18
diff
changeset
|
61 public func colorLine() -> Color { |
108
f53d8b9ca92b
Custom style implemented
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
106
diff
changeset
|
62 var color = style.uptrendLineColor |
5
f828c7c408d4
Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff
changeset
|
63 |
94
e0c0306fb079
Fix bug color LineChartView on dragGesture
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
60
diff
changeset
|
64 if showingIndicators { |
108
f53d8b9ca92b
Custom style implemented
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
106
diff
changeset
|
65 color = style.showingIndicatorLineColor |
94
e0c0306fb079
Fix bug color LineChartView on dragGesture
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
60
diff
changeset
|
66 } else if data.first! > data.last! { |
108
f53d8b9ca92b
Custom style implemented
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
106
diff
changeset
|
67 color = style.downtrendLineColor |
5
f828c7c408d4
Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff
changeset
|
68 } else if data.first! == data.last! { |
108
f53d8b9ca92b
Custom style implemented
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
106
diff
changeset
|
69 color = style.flatTrendLineColor |
5
f828c7c408d4
Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff
changeset
|
70 } |
f828c7c408d4
Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff
changeset
|
71 |
f828c7c408d4
Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff
changeset
|
72 return color |
f828c7c408d4
Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff
changeset
|
73 } |
8
959175ee5ebd
Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
5
diff
changeset
|
74 |
959175ee5ebd
Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
5
diff
changeset
|
75 /* |
959175ee5ebd
Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
5
diff
changeset
|
76 When the user drag on Path -> Modifiy indicator point to move it on the path accordingly |
959175ee5ebd
Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
5
diff
changeset
|
77 */ |
20
24dfde3727c1
Make variables and structures public
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
18
diff
changeset
|
78 public func dragGesture(_ longPressLocation: CGPoint) { |
8
959175ee5ebd
Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
5
diff
changeset
|
79 let (closestXPoint, closestYPoint, yPointIndex) = getClosestValueFrom(longPressLocation, inData: pathPoints) |
959175ee5ebd
Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
5
diff
changeset
|
80 self.IndicatorPointPosition.x = closestXPoint |
959175ee5ebd
Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
5
diff
changeset
|
81 self.IndicatorPointPosition.y = closestYPoint |
959175ee5ebd
Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
5
diff
changeset
|
82 self.showingIndicators = true |
959175ee5ebd
Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
5
diff
changeset
|
83 self.indexPosition = yPointIndex |
959175ee5ebd
Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
5
diff
changeset
|
84 } |
959175ee5ebd
Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
5
diff
changeset
|
85 |
959175ee5ebd
Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
5
diff
changeset
|
86 /* |
959175ee5ebd
Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
5
diff
changeset
|
87 First, search the closest X point in Path from the tapped location. |
959175ee5ebd
Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
5
diff
changeset
|
88 Then, find the correspondent Y point in Path. |
959175ee5ebd
Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
5
diff
changeset
|
89 */ |
20
24dfde3727c1
Make variables and structures public
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
18
diff
changeset
|
90 public func getClosestValueFrom(_ value: CGPoint, inData: [CGPoint]) -> (CGFloat, CGFloat, Int) { |
8
959175ee5ebd
Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
5
diff
changeset
|
91 let touchPoint: (CGFloat, CGFloat) = (value.x, value.y) |
959175ee5ebd
Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
5
diff
changeset
|
92 let xPathPoints = inData.map { $0.x } |
959175ee5ebd
Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
5
diff
changeset
|
93 let yPathPoints = inData.map { $0.y } |
959175ee5ebd
Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
5
diff
changeset
|
94 |
959175ee5ebd
Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
5
diff
changeset
|
95 // Closest X value |
959175ee5ebd
Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
5
diff
changeset
|
96 let closestXPoint = xPathPoints.enumerated().min( by: { abs($0.1 - touchPoint.0) < abs($1.1 - touchPoint.0) } )! |
959175ee5ebd
Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
5
diff
changeset
|
97 let closestYPointIndex = xPathPoints.firstIndex(of: closestXPoint.element)! |
959175ee5ebd
Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
5
diff
changeset
|
98 let closestYPoint = yPathPoints[closestYPointIndex] |
959175ee5ebd
Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
5
diff
changeset
|
99 |
959175ee5ebd
Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
5
diff
changeset
|
100 // Index of the closest points in the array |
959175ee5ebd
Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
5
diff
changeset
|
101 let yPointIndex = yPathPoints.firstIndex(of: closestYPoint)! |
959175ee5ebd
Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
5
diff
changeset
|
102 |
959175ee5ebd
Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
5
diff
changeset
|
103 return (closestXPoint.element, closestYPoint, yPointIndex) |
959175ee5ebd
Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
5
diff
changeset
|
104 } |
5
f828c7c408d4
Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff
changeset
|
105 } |