Commit fc2ee488 by Dmitriy Stepanets

Added ability to show additional graph line

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