Skip to content

Commit 850b19e

Browse files
committed
Fix chart scales & zooming
1 parent 45cdcfb commit 850b19e

12 files changed

Lines changed: 79 additions & 51 deletions

‎submodules/GraphCore/Sources/Charts/Controllers/GeneralChartComponentController.swift‎

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -269,16 +269,20 @@ class GeneralChartComponentController: ChartThemeContainer {
269269

270270
var numberOfOffsetsPerItem = ditance / approximateNumberOfChartValues
271271
var multiplier: CGFloat = 1.0
272-
while numberOfOffsetsPerItem > 10 {
273-
numberOfOffsetsPerItem /= 10
274-
multiplier *= 10
272+
if numberOfOffsetsPerItem > 0 {
273+
while numberOfOffsetsPerItem > 10 {
274+
numberOfOffsetsPerItem /= 10
275+
multiplier *= 10
276+
}
275277
}
276278
var dividor: CGFloat = 1.0
277279
var maximumNumberOfDecimals = 2
278-
while numberOfOffsetsPerItem < 1 {
279-
numberOfOffsetsPerItem *= 10
280-
dividor *= 10
281-
maximumNumberOfDecimals += 1
280+
if numberOfOffsetsPerItem > 0 {
281+
while numberOfOffsetsPerItem < 1 {
282+
numberOfOffsetsPerItem *= 10
283+
dividor *= 10
284+
maximumNumberOfDecimals += 1
285+
}
282286
}
283287

284288
var base: CGFloat = BaseConstants.verticalBaseAnchors.first { numberOfOffsetsPerItem > $0 } ?? BaseConstants.defaultVerticalBaseAnchor

‎submodules/GraphCore/Sources/Charts/Controllers/Lines/BaseLinesChartController.swift‎

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -107,14 +107,16 @@ public class BaseLinesChartController: BaseChartController {
107107
color: component.color,
108108
visible: actualChartVisibility[index])
109109
}
110+
let total = actualChartsCollection.chartValues.enumerated().map { $0.element.values[pointIndex] }.reduce(0, +)
111+
110112
let dateString: String
111113
if isZoomed {
112114
dateString = BaseConstants.timeDateFormatter.string(from: closestDate)
113115
} else {
114116
dateString = BaseConstants.headerMediumRangeFormatter.string(from: closestDate)
115117
}
116118
let viewModel = ChartDetailsViewModel(title: dateString,
117-
showArrow: self.isZoomable && !self.isZoomed,
119+
showArrow: total > 0 && self.isZoomable && !self.isZoomed,
118120
showPrefixes: false,
119121
values: values,
120122
totalValue: nil,
@@ -194,16 +196,20 @@ public class BaseLinesChartController: BaseChartController {
194196

195197
var numberOfOffsetsPerItem = distance / approximateNumberOfChartValues
196198
var multiplier: CGFloat = 1.0
197-
while numberOfOffsetsPerItem > 10 {
198-
numberOfOffsetsPerItem /= 10
199-
multiplier *= 10
199+
if numberOfOffsetsPerItem > 0 {
200+
while numberOfOffsetsPerItem > 10 {
201+
numberOfOffsetsPerItem /= 10
202+
multiplier *= 10
203+
}
200204
}
201205
var dividor: CGFloat = 1.0
202206
var maximumNumberOfDecimals = 2
203-
while numberOfOffsetsPerItem < 1 {
204-
numberOfOffsetsPerItem *= 10
205-
dividor *= 10
206-
maximumNumberOfDecimals += 1
207+
if numberOfOffsetsPerItem > 0 {
208+
while numberOfOffsetsPerItem < 1 {
209+
numberOfOffsetsPerItem *= 10
210+
dividor *= 10
211+
maximumNumberOfDecimals += 1
212+
}
207213
}
208214

209215
var base: CGFloat = BaseConstants.verticalBaseAnchors.first { numberOfOffsetsPerItem > $0 } ?? BaseConstants.defaultVerticalBaseAnchor

‎submodules/GraphCore/Sources/Charts/Controllers/Lines/GeneralLinesChartController.swift‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ public class GeneralLinesChartController: BaseLinesChartController {
6161
self.prevoiusHorizontalStrideInterval = -1
6262
self.totalVerticalRange = LinesChartRenderer.LineData.verticalRange(lines: chartLines) ?? Constants.defaultRange
6363
self.totalHorizontalRange = LinesChartRenderer.LineData.horizontalRange(lines: chartLines) ?? Constants.defaultRange
64-
self.lineBulletsRenderer.bullets = self.chartLines.map { LineBulletsRenderer.Bullet(coordinate: $0.points.first ?? .zero,
64+
self.lineBulletsRenderer.bullets = self.chartLines.map { LineBulletsRenderer.Bullet(coordinate: $0.points.first ?? .zero, offset: .zero,
6565
color: $0.color)}
6666

6767
let chartRange: ClosedRange<CGFloat>
@@ -133,7 +133,7 @@ public class GeneralLinesChartController: BaseLinesChartController {
133133
super.chartInteractionDidBegin(point: point)
134134

135135
self.lineBulletsRenderer.bullets = chartLines.compactMap { chart in
136-
return LineBulletsRenderer.Bullet(coordinate: chart.points[minIndex], color: chart.color)
136+
return LineBulletsRenderer.Bullet(coordinate: chart.points[minIndex], offset: .zero, color: chart.color)
137137
}
138138
self.lineBulletsRenderer.isEnabled = true
139139

‎submodules/GraphCore/Sources/Charts/Controllers/Lines/TwoAxisLinesChartController.swift‎

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ public class TwoAxisLinesChartController: BaseLinesChartController {
7777
controller.verticalScalesRenderer.labelsColor = chart.color
7878
controller.totalVerticalRange = LinesChartRenderer.LineData.verticalRange(lines: chartLines) ?? Constants.defaultRange
7979
self.totalHorizontalRange = LinesChartRenderer.LineData.horizontalRange(lines: chartLines) ?? Constants.defaultRange
80-
controller.lineBulletsRenderer.bullets = chartLines.map { LineBulletsRenderer.Bullet(coordinate: $0.points.first ?? .zero,
80+
controller.lineBulletsRenderer.bullets = chartLines.map { LineBulletsRenderer.Bullet(coordinate: $0.points.first ?? .zero, offset: .zero,
8181
color: $0.color) }
8282
controller.previewLinesRenderer.setup(horizontalRange: self.totalHorizontalRange, animated: animated)
8383
controller.previewLinesRenderer.setup(verticalRange: controller.totalVerticalRange, animated: animated)
@@ -161,7 +161,7 @@ public class TwoAxisLinesChartController: BaseLinesChartController {
161161

162162
for graphController in graphControllers {
163163
graphController.lineBulletsRenderer.bullets = graphController.chartLines.map { chart in
164-
LineBulletsRenderer.Bullet(coordinate: chart.points[minIndex], color: chart.color)
164+
LineBulletsRenderer.Bullet(coordinate: chart.points[minIndex], offset: .zero, color: chart.color)
165165
}
166166
graphController.lineBulletsRenderer.isEnabled = true
167167
}
@@ -246,16 +246,20 @@ public class TwoAxisLinesChartController: BaseLinesChartController {
246246
var numberOfOffsetsPerItem = verticalRange.distance / approximateNumberOfChartValues
247247

248248
var multiplier: CGFloat = 1.0
249-
while numberOfOffsetsPerItem > 10 {
250-
numberOfOffsetsPerItem /= 10
251-
multiplier *= 10
249+
if numberOfOffsetsPerItem > 0 {
250+
while numberOfOffsetsPerItem > 10 {
251+
numberOfOffsetsPerItem /= 10
252+
multiplier *= 10
253+
}
252254
}
253255
var dividor: CGFloat = 1.0
254256
var maximumNumberOfDecimals = 2
255-
while numberOfOffsetsPerItem < 1 {
256-
numberOfOffsetsPerItem *= 10
257-
dividor *= 10
258-
maximumNumberOfDecimals += 1
257+
if numberOfOffsetsPerItem > 0 {
258+
while numberOfOffsetsPerItem < 1 {
259+
numberOfOffsetsPerItem *= 10
260+
dividor *= 10
261+
maximumNumberOfDecimals += 1
262+
}
259263
}
260264

261265
let generalBase = Constants.verticalBaseAnchors.first { numberOfOffsetsPerItem > $0 } ?? BaseConstants.defaultVerticalBaseAnchor

‎submodules/GraphCore/Sources/Charts/Controllers/Stacked Bars/LinesComponentController.swift‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ class LinesComponentController: GeneralChartComponentController {
6262
let (chartLines, totalHorizontalRange, totalVerticalRange) = LinesChartRenderer.LineData.initialComponents(chartsCollection: chartsCollection)
6363
self.chartLines = chartLines
6464

65-
self.lineBulletsRenderer.bullets = self.chartLines.map { LineBulletsRenderer.Bullet(coordinate: $0.points.first ?? .zero,
65+
self.lineBulletsRenderer.bullets = self.chartLines.map { LineBulletsRenderer.Bullet(coordinate: $0.points.first ?? .zero, offset: .zero,
6666
color: $0.color)}
6767

6868
super.initialize(chartsCollection: chartsCollection,
@@ -190,7 +190,7 @@ class LinesComponentController: GeneralChartComponentController {
190190
lineBulletsRenderer.isEnabled = true
191191
lineBulletsRenderer.setVisible(true, animated: animted)
192192
lineBulletsRenderer.bullets = chartLines.compactMap { chart in
193-
return LineBulletsRenderer.Bullet(coordinate: chart.points[dataIndex], color: chart.color)
193+
return LineBulletsRenderer.Bullet(coordinate: chart.points[dataIndex], offset: .zero, color: chart.color)
194194
}
195195
}
196196

‎submodules/GraphCore/Sources/Charts/Controllers/Stacked Bars/TwoAxisStepBarsChartController.swift‎

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ public class TwoAxisStepBarsChartController: BaseLinesChartController {
7272
for i in 0 ..< chartBars.locations.count {
7373
let location = chartBars.locations[i]
7474
let value = component.values[i]
75-
bullets.append(LineBulletsRenderer.Bullet(coordinate: CGPoint(x: location, y: value), color: component.color))
75+
bullets.append(LineBulletsRenderer.Bullet(coordinate: CGPoint(x: location, y: value), offset: .zero, color: component.color))
7676
}
7777
}
7878

@@ -155,12 +155,17 @@ public class TwoAxisStepBarsChartController: BaseLinesChartController {
155155
let chartInteractionWasBegin = isChartInteractionBegun
156156
super.chartInteractionDidBegin(point: point)
157157

158+
var barOffset: CGFloat = 0.0
158159
for graphController in graphControllers {
159160
var bullets: [LineBulletsRenderer.Bullet] = []
160161
if let component = graphController.chartBars.components.first {
161162
let location = graphController.chartBars.locations[minIndex]
162163
let value = component.values[minIndex]
163-
bullets.append(LineBulletsRenderer.Bullet(coordinate: CGPoint(x: location, y: value), color: component.color))
164+
165+
let offset = -(graphController.mainBarsRenderer.transform(toChartCoordinateHorizontal: horizontalRange.lowerBound + graphController.barsWidth, chartFrame: chartFrame) - chartFrame.minX) / 2.0
166+
barOffset = offset
167+
168+
bullets.append(LineBulletsRenderer.Bullet(coordinate: CGPoint(x: location, y: value), offset: CGPoint(x: offset, y: 0.0), color: component.color))
164169
}
165170
graphController.lineBulletsRenderer.bullets = bullets
166171
graphController.lineBulletsRenderer.isEnabled = true
@@ -172,6 +177,7 @@ public class TwoAxisStepBarsChartController: BaseLinesChartController {
172177
self.setDetailsChartVisibleClosure?(true, true)
173178
self.setDetailsViewPositionClosure?(detailsViewPosition)
174179
self.verticalLineRenderer.values = [chartValue]
180+
self.verticalLineRenderer.offset = barOffset
175181
}
176182

177183
public override var currentChartHorizontalRangeFraction: ClosedRange<CGFloat> {
@@ -244,18 +250,22 @@ public class TwoAxisStepBarsChartController: BaseLinesChartController {
244250
var numberOfOffsetsPerItem = verticalRange.distance / approximateNumberOfChartValues
245251

246252
var multiplier: CGFloat = 1.0
247-
while numberOfOffsetsPerItem > 10 {
248-
numberOfOffsetsPerItem /= 10
249-
multiplier *= 10
253+
if numberOfOffsetsPerItem > 0 {
254+
while numberOfOffsetsPerItem > 10 {
255+
numberOfOffsetsPerItem /= 10
256+
multiplier *= 10
257+
}
250258
}
251259
var dividor: CGFloat = 1.0
252260
var maximumNumberOfDecimals = 2
253-
while numberOfOffsetsPerItem < 1 {
254-
numberOfOffsetsPerItem *= 10
255-
dividor *= 10
256-
maximumNumberOfDecimals += 1
261+
if numberOfOffsetsPerItem > 0 {
262+
while numberOfOffsetsPerItem < 1 {
263+
numberOfOffsetsPerItem *= 10
264+
dividor *= 10
265+
maximumNumberOfDecimals += 1
266+
}
257267
}
258-
268+
259269
let generalBase = Constants.verticalBaseAnchors.first { numberOfOffsetsPerItem > $0 } ?? BaseConstants.defaultVerticalBaseAnchor
260270
let base = generalBase * multiplier / dividor
261271

‎submodules/GraphCore/Sources/Charts/Renderes/LineBulletsRenerer.swift‎

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import UIKit
1616
class LineBulletsRenderer: BaseChartRenderer {
1717
struct Bullet {
1818
var coordinate: CGPoint
19+
var offset: CGPoint
1920
var color: GColor
2021
}
2122

@@ -56,8 +57,8 @@ class LineBulletsRenderer: BaseChartRenderer {
5657
let alpha = alphaAnimators[index].current
5758
if alpha == 0 { continue }
5859

59-
let centerX = transform(toChartCoordinateHorizontal: bullet.coordinate.x, chartFrame: chartFrame)
60-
let centerY = transform(toChartCoordinateVertical: bullet.coordinate.y, chartFrame: chartFrame)
60+
let centerX = transform(toChartCoordinateHorizontal: bullet.coordinate.x, chartFrame: chartFrame) + bullet.offset.x
61+
let centerY = transform(toChartCoordinateVertical: bullet.coordinate.y, chartFrame: chartFrame) + bullet.offset.y
6162
context.setFillColor(innerColorAnimator.current.color.withAlphaComponent(alpha).cgColor)
6263
context.setStrokeColor(bullet.color.withAlphaComponent(alpha).cgColor)
6364
context.setLineWidth(linesWidth)

‎submodules/GraphCore/Sources/Charts/Renderes/VerticalLinesRenderer.swift‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ class VerticalLinesRenderer: BaseChartRenderer {
2020
setNeedsDisplay()
2121
}
2222
}
23+
var offset: CGFloat = 0.0
2324
private var alphaAnimators: [AnimationController<CGFloat>] = []
2425

2526
var linesColor: GColor = .black
@@ -39,7 +40,7 @@ class VerticalLinesRenderer: BaseChartRenderer {
3940
if alpha == 0 { continue }
4041

4142
context.setStrokeColor(linesColor.withAlphaComponent(linesColor.alphaValue * alpha).cgColor)
42-
let pointX = transform(toChartCoordinateHorizontal: value, chartFrame: chartFrame)
43+
let pointX = transform(toChartCoordinateHorizontal: value, chartFrame: chartFrame) + offset
4344
context.strokeLineSegments(between: [CGPoint(x: pointX, y: chartFrame.minY),
4445
CGPoint(x: pointX, y: chartFrame.maxY)])
4546
}

‎submodules/GraphCore/Sources/Charts/Renderes/VerticalScalesRenderer.swift‎

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -100,11 +100,10 @@ class VerticalScalesRenderer: BaseChartRenderer {
100100
if generalAlpha == 0 { return }
101101
let labelColorAlpha = labelsColor.alphaValue
102102

103+
let spacing: CGFloat = 1.0
104+
context.clip(to: CGRect(origin: CGPoint(x: 0.0, y: chartFrame.minY - spacing), size: CGSize(width: chartFrame.width + chartFrame.origin.x * 2.0, height: chartFrame.height + spacing * 2.0)))
105+
103106
func drawLines(_ labels: [LinesChartLabel], alpha: CGFloat) {
104-
var labels = labels
105-
if labels.count > 1 {
106-
labels.removeFirst()
107-
}
108107
var lineSegments: [CGPoint] = []
109108
let x0 = chartFrame.minX
110109
let x1 = chartFrame.maxX
@@ -113,8 +112,10 @@ class VerticalScalesRenderer: BaseChartRenderer {
113112

114113
for lineInfo in labels {
115114
let y = transform(toChartCoordinateVertical: lineInfo.value, chartFrame: chartFrame).roundedUpToPixelGrid()
116-
lineSegments.append(CGPoint(x: x0, y: y))
117-
lineSegments.append(CGPoint(x: x1, y: y))
115+
if y < chartFrame.maxY - 2.0 {
116+
lineSegments.append(CGPoint(x: x0, y: y))
117+
lineSegments.append(CGPoint(x: x1, y: y))
118+
}
118119
}
119120
context.strokeLineSegments(between: lineSegments)
120121
}
@@ -164,5 +165,7 @@ class VerticalScalesRenderer: BaseChartRenderer {
164165
attributes: [.foregroundColor: labelsColor.withAlphaComponent(animatedLabesAndLines.alphaAnimator.current * labelColorAlpha * generalAlpha),
165166
.font: labelsFont])
166167
}
168+
169+
context.resetClip()
167170
}
168171
}

‎submodules/GraphCore/Sources/Helpers/AnimationController.swift‎

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@ enum TimeFunction {
2828
return time / duration
2929
case .easeIn:
3030
return (pow(2, 10 * (time / duration - 1)) - 0.0009765625) * 1.0009775171065499
31-
3231
case .easeOut:
3332
return (-pow(2, -10 * time / duration)) + 1 * 1.0009775171065499
3433
}

0 commit comments

Comments
 (0)