Commit fc2ee488 by Dmitriy Stepanets

Added ability to show additional graph line

parent 4782e52f
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
<key>1Weather.xcscheme_^#shared#^_</key> <key>1Weather.xcscheme_^#shared#^_</key>
<dict> <dict>
<key>orderHint</key> <key>orderHint</key>
<integer>5</integer> <integer>3</integer>
</dict> </dict>
<key>PG (Playground) 1.xcscheme</key> <key>PG (Playground) 1.xcscheme</key>
<dict> <dict>
......
...@@ -15,7 +15,7 @@ struct LineDot { ...@@ -15,7 +15,7 @@ struct LineDot {
struct GraphLine { struct GraphLine {
//Private //Private
private static let cubicCurveAlgorithm = CubicCurveAlgorithm() private let cubicCurveAlgorithm = CubicCurveAlgorithm()
private let kIntersectAccuracy:CGFloat = 2 private let kIntersectAccuracy:CGFloat = 2
private var points = [CGPoint]() private var points = [CGPoint]()
private let settings:GraphLineSettings private let settings:GraphLineSettings
...@@ -56,8 +56,8 @@ struct GraphLine { ...@@ -56,8 +56,8 @@ struct GraphLine {
private mutating func linePath(from points:[CGPoint]) -> UIBezierPath { private mutating func linePath(from points:[CGPoint]) -> UIBezierPath {
let path = UIBezierPath() let path = UIBezierPath()
let startPoint = CGPoint(x: 0, y: self.onGetGraphRect().height) let startPoint = CGPoint(x: 0, y: points.first?.y ?? 0)
let endPoint = CGPoint(x: self.onGetGraphRect().width, y: self.onGetGraphRect().height) let endPoint = CGPoint(x: self.onGetGraphRect().width, y: points.last?.y ?? 0)
var pointsToAdd = [CGPoint]() var pointsToAdd = [CGPoint]()
pointsToAdd.append(startPoint) pointsToAdd.append(startPoint)
...@@ -70,13 +70,13 @@ struct GraphLine { ...@@ -70,13 +70,13 @@ struct GraphLine {
return path return path
} }
let controlPoints = GraphLine.cubicCurveAlgorithm.controlPointsFromPoints(dataPoints: pointsToAdd) let controlPoints = cubicCurveAlgorithm.controlPointsFromPoints(dataPoints: pointsToAdd)
for index in 1..<pointsToAdd.count { for index in 1..<pointsToAdd.count {
sections.append(.init(p0: pointsToAdd[index - 1], sections.append(.init(p0: pointsToAdd[index - 1],
p1: controlPoints[index - 1].controlPoint1, p1: controlPoints[index - 1].controlPoint1,
p2: controlPoints[index - 1].controlPoint2, p2: controlPoints[index - 1].controlPoint2,
p3: pointsToAdd[index])) p3: pointsToAdd[index]))
path.addCurve(to: pointsToAdd[index], path.addCurve(to: pointsToAdd[index],
controlPoint1: controlPoints[index - 1].controlPoint1, controlPoint1: controlPoints[index - 1].controlPoint1,
controlPoint2: controlPoints[index - 1].controlPoint2) controlPoint2: controlPoints[index - 1].controlPoint2)
...@@ -136,11 +136,11 @@ struct GraphLine { ...@@ -136,11 +136,11 @@ struct GraphLine {
func tintDotAt(point:CGPoint) { func tintDotAt(point:CGPoint) {
lineDots.forEach { lineDots.forEach {
$0.shape.strokeColor = ThemeManager.currentTheme.graphColor.cgColor $0.shape.strokeColor = settings.color.cgColor
} }
guard let dotToTint = (lineDots.first{$0.center == point}) else { return } guard let dotToTint = (lineDots.first{$0.center == point}) else { return }
dotToTint.shape.strokeColor = ThemeManager.currentTheme.graphTintColor.cgColor dotToTint.shape.strokeColor = settings.tintColor.cgColor
} }
mutating func updateWith(points:[CGPoint]) { mutating func updateWith(points:[CGPoint]) {
......
...@@ -11,13 +11,13 @@ import BezierKit ...@@ -11,13 +11,13 @@ import BezierKit
class GraphView: UIView { class GraphView: UIView {
//Private //Private
private let mainLineSettings = GraphLineSettings(lineWidth: 3, private let mainLineSettings = GraphLineSettings(lineWidth: 3,
dotRadius: 3, dotRadius: 2.5,
dotLineWidth: 2, dotLineWidth: 2,
color: ThemeManager.currentTheme.graphColor, color: ThemeManager.currentTheme.graphColor,
tintColor: ThemeManager.currentTheme.graphTintColor) tintColor: ThemeManager.currentTheme.graphTintColor)
private let additionalLineSettings = GraphLineSettings(lineWidth: 2, private let additionalLineSettings = GraphLineSettings(lineWidth: 2,
dotRadius: 2, dotRadius: 2,
dotLineWidth: 1 / UIScreen.main.scale, dotLineWidth: 1,
color: UIColor(hex: 0xa4a4a4).withAlphaComponent(0.7), color: UIColor(hex: 0xa4a4a4).withAlphaComponent(0.7),
tintColor: UIColor(hex: 0x434343).withAlphaComponent(0.7)) tintColor: UIColor(hex: 0x434343).withAlphaComponent(0.7))
......
...@@ -27,14 +27,14 @@ class CityForecastTimePeriodCell: UITableViewCell { ...@@ -27,14 +27,14 @@ class CityForecastTimePeriodCell: UITableViewCell {
private var maxTempGraphPoints = [CGPoint]() private var maxTempGraphPoints = [CGPoint]()
private var minTempGraphPoints = [CGPoint]() private var minTempGraphPoints = [CGPoint]()
private let graphView = GraphView() private let graphView = GraphView()
private let dayTemps = [DayTemp(min: 8, max: 17), private let dayTemps = [DayTemp(min: -23, max: -13),
DayTemp(min: 9, max: 17), DayTemp(min: -19, max: -12),
DayTemp(min: 7, max: 18), DayTemp(min: -12, max: -10),
DayTemp(min: 7, max: 17), DayTemp(min: -10, max: -3),
DayTemp(min: 8, max: 17), DayTemp(min: -7, max: -3),
DayTemp(min: 8, max: 18), DayTemp(min: -11, max: -1),
DayTemp(min: 9, max: 18), DayTemp(min: -14, max: -5),
DayTemp(min: 8, max: 16)] DayTemp(min: -15, max: -7)]
private var graphIsDrawn = false private var graphIsDrawn = false
override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
...@@ -100,31 +100,36 @@ class CityForecastTimePeriodCell: UITableViewCell { ...@@ -100,31 +100,36 @@ class CityForecastTimePeriodCell: UITableViewCell {
self.maxTempGraphPoints.removeAll() self.maxTempGraphPoints.removeAll()
self.minTempGraphPoints.removeAll() self.minTempGraphPoints.removeAll()
let maxTemp = CGFloat(dayTemps.map{$0.max}.max() ?? 0) let maxTemps = dayTemps.map{$0.max}
let minTemp = CGFloat(dayTemps.map{$0.min}.min() ?? 0) let topMaxTemp = maxTemps.max() ?? 0
let minTemps = dayTemps.map{$0.min}
let topMinTemp = minTemps.max() ?? 0
for index in 0..<dayTemps.count { for index in 0..<dayTemps.count {
guard let stackButton = stackView.arrangedSubviews[index] as? PeriodForecastButton else { continue } guard let stackButton = stackView.arrangedSubviews[index] as? PeriodForecastButton else { continue }
let buttonRightSide = stackButton.frame.origin.x + stackButton.bounds.width let buttonRightSide = stackButton.frame.origin.x + stackButton.bounds.width
let buttonCenterX = (buttonRightSide + stackButton.frame.origin.x) / 2 let buttonCenterX = (buttonRightSide + stackButton.frame.origin.x) / 2
let numberOfLevels = maxTemp - minTemp
let levelHeight = (graphView.frame.height / numberOfLevels).rounded(.down)
var maxPointLevel = (maxTemp - dayTemps[index].max) * levelHeight
var minPointLevel = (minTemp + dayTemps[index].min) * levelHeight
//Add points offset at cirle radius if needed let maxTempLevelsCount = CGFloat(Set(maxTemps).count)
maxPointLevel = max(maxPointLevel, 5) let minTempLevelsCount = CGFloat(Set(minTemps).count)
maxPointLevel = min(maxPointLevel, graphView.frame.height - 5) let totalLevels = maxTempLevelsCount + minTempLevelsCount
let levelHeight = (graphView.frame.height / CGFloat(totalLevels)).rounded(.down)
let maxTempFrame = CGRect(x: 0, y: 0, width: graphView.frame.width, height: maxTempLevelsCount * levelHeight)
let minTempFrame = CGRect(x: 0, y: maxTempFrame.height, width: graphView.frame.width, height: minTempLevelsCount * levelHeight)
minPointLevel = min(minPointLevel, 5) //Max
minPointLevel = max(minPointLevel, graphView.frame.height - 5) var maxPointLevel = maxTempFrame.origin.y + ((topMaxTemp - maxTemps[index]) * levelHeight) + levelHeight
maxPointLevel = min(maxPointLevel, maxTempFrame.height + 5)
//Min
var minPointLevel = minTempFrame.origin.y + ((topMinTemp - minTemps[index]) * levelHeight) + levelHeight
minPointLevel = min(minPointLevel, minTempFrame.height + minTempFrame.origin.y - 5)
maxTempGraphPoints.append(.init(x: buttonCenterX, y: maxPointLevel)) maxTempGraphPoints.append(.init(x: buttonCenterX, y: maxPointLevel))
minTempGraphPoints.append(.init(x: buttonCenterX, y: minPointLevel)) minTempGraphPoints.append(.init(x: buttonCenterX, y: minPointLevel))
} }
print("break")
} }
@objc private func handleConditionButton(button: PeriodForecastButton) { @objc private func handleConditionButton(button: PeriodForecastButton) {
......
...@@ -9,7 +9,7 @@ import UIKit ...@@ -9,7 +9,7 @@ import UIKit
class PeriodForecastButton: UIControl { class PeriodForecastButton: UIControl {
//Private //Private
private let kGraphInset:CGFloat = 4 private let kGraphInset:CGFloat = 10
private let forecastImageView = UIImageView() private let forecastImageView = UIImageView()
private let tempLabel = UILabel() private let tempLabel = UILabel()
private let indicatorImageView = UIImageView() private let indicatorImageView = UIImageView()
...@@ -24,7 +24,7 @@ class PeriodForecastButton: UIControl { ...@@ -24,7 +24,7 @@ class PeriodForecastButton: UIControl {
return .init(x: 0, return .init(x: 0,
y: topInset, y: topInset,
width: self.bounds.width, width: self.bounds.width,
height: self.minTempLabel.frame.origin.y - topInset - kGraphInset) height: self.minTempLabel.frame.origin.y - self.tempLabel.frame.origin.y - tempLabel.frame.height)
} }
override init(frame: CGRect) { override init(frame: CGRect) {
......
...@@ -18,6 +18,11 @@ ...@@ -18,6 +18,11 @@
<key>orderHint</key> <key>orderHint</key>
<integer>1</integer> <integer>1</integer>
</dict> </dict>
<key>Cirque.xcscheme_^#shared#^_</key>
<dict>
<key>orderHint</key>
<integer>4</integer>
</dict>
<key>Localize-Swift.xcscheme</key> <key>Localize-Swift.xcscheme</key>
<dict> <dict>
<key>isShown</key> <key>isShown</key>
...@@ -25,19 +30,24 @@ ...@@ -25,19 +30,24 @@
<key>orderHint</key> <key>orderHint</key>
<integer>2</integer> <integer>2</integer>
</dict> </dict>
<key>Localize-Swift.xcscheme_^#shared#^_</key>
<dict>
<key>orderHint</key>
<integer>5</integer>
</dict>
<key>Pods-1Weather.xcscheme</key> <key>Pods-1Weather.xcscheme</key>
<dict> <dict>
<key>isShown</key> <key>isShown</key>
<false/> <false/>
<key>orderHint</key> <key>orderHint</key>
<integer>3</integer> <integer>1</integer>
</dict> </dict>
<key>SnapKit.xcscheme</key> <key>SnapKit.xcscheme</key>
<dict> <dict>
<key>isShown</key> <key>isShown</key>
<false/> <false/>
<key>orderHint</key> <key>orderHint</key>
<integer>4</integer> <integer>2</integer>
</dict> </dict>
</dict> </dict>
<key>SuppressBuildableAutocreation</key> <key>SuppressBuildableAutocreation</key>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment