Commit 11ba9772 by Dmitriy Stepanets

Added generic initialization for the period button

parent e8b2c07d
......@@ -21,6 +21,8 @@
CD39F2EE25DE858D009FE398 /* NotificationName+Localization.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD39F2ED25DE858D009FE398 /* NotificationName+Localization.swift */; };
CD39F2F225DE94C4009FE398 /* CitySunCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD39F2F125DE94C4009FE398 /* CitySunCell.swift */; };
CD39F2F525DE9571009FE398 /* ArrowButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD39F2F425DE9571009FE398 /* ArrowButton.swift */; };
CD3F6E6925FA59D4002DB99B /* ForecastDetailPeriodButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD3F6E6825FA59D4002DB99B /* ForecastDetailPeriodButton.swift */; };
CD3F6E6C25FA5A90002DB99B /* PeriodButtonProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD3F6E6B25FA5A90002DB99B /* PeriodButtonProtocol.swift */; };
CD647D0225ED07D60034578B /* TodayViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD647D0125ED07D60034578B /* TodayViewModel.swift */; };
CD647D0625ED08050034578B /* ViewModelProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD647D0525ED08050034578B /* ViewModelProtocol.swift */; };
CD6B3036257262C2004B34B3 /* UIColor+Highlight.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD6B3035257262C2004B34B3 /* UIColor+Highlight.swift */; };
......@@ -50,6 +52,7 @@
CDA5542825EF734200A2E08C /* TodayCellFactory.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDA5542725EF734200A2E08C /* TodayCellFactory.swift */; };
CDA5542D25EF7C9700A2E08C /* ReusableCellProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDA5542C25EF7C9700A2E08C /* ReusableCellProtocol.swift */; };
CDA5543025EFA13F00A2E08C /* Measurement+String.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDA5542F25EFA13F00A2E08C /* Measurement+String.swift */; };
CDB8AA2225FB76FF00BF4D22 /* PeriodButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDB8AA2125FB76FF00BF4D22 /* PeriodButton.swift */; };
CDC6124F25E7964700188DA7 /* CityDayTimesCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDC6124E25E7964700188DA7 /* CityDayTimesCell.swift */; };
CDC6125325E79C8F00188DA7 /* DayTimeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDC6125225E79C8F00188DA7 /* DayTimeView.swift */; };
CDC6125725E7AB1A00188DA7 /* CityAirQualityCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDC6125625E7AB1A00188DA7 /* CityAirQualityCell.swift */; };
......@@ -64,7 +67,7 @@
CDE18DCD25D1666700C80ED9 /* ForecastCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDE18DCC25D1666700C80ED9 /* ForecastCoordinator.swift */; };
CDE18DD125D166F900C80ED9 /* ForecastViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDE18DD025D166F900C80ED9 /* ForecastViewController.swift */; };
CDE18DD825D16CB200C80ED9 /* NavigationCityButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDE18DD725D16CB200C80ED9 /* NavigationCityButton.swift */; };
CDEE8AD725DA882200C289DE /* PeriodForecastButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDEE8AD625DA882200C289DE /* PeriodForecastButton.swift */; };
CDEE8AD725DA882200C289DE /* ForecastPeriodButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDEE8AD625DA882200C289DE /* ForecastPeriodButton.swift */; };
CE578FD325F7E89400E8B85D /* DayTimeWeather.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE578FD225F7E89400E8B85D /* DayTimeWeather.swift */; };
CE9D181625ECB8370028D9D7 /* MulticastDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE9D181525ECB8370028D9D7 /* MulticastDelegate.swift */; };
CE9D181925ECB9A70028D9D7 /* Logger.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE9D181825ECB9A70028D9D7 /* Logger.swift */; };
......@@ -109,6 +112,8 @@
CD39F2ED25DE858D009FE398 /* NotificationName+Localization.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NotificationName+Localization.swift"; sourceTree = "<group>"; };
CD39F2F125DE94C4009FE398 /* CitySunCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CitySunCell.swift; sourceTree = "<group>"; };
CD39F2F425DE9571009FE398 /* ArrowButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ArrowButton.swift; sourceTree = "<group>"; };
CD3F6E6825FA59D4002DB99B /* ForecastDetailPeriodButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ForecastDetailPeriodButton.swift; sourceTree = "<group>"; };
CD3F6E6B25FA5A90002DB99B /* PeriodButtonProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PeriodButtonProtocol.swift; sourceTree = "<group>"; };
CD647D0125ED07D60034578B /* TodayViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TodayViewModel.swift; sourceTree = "<group>"; };
CD647D0525ED08050034578B /* ViewModelProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewModelProtocol.swift; sourceTree = "<group>"; };
CD6B3035257262C2004B34B3 /* UIColor+Highlight.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIColor+Highlight.swift"; sourceTree = "<group>"; };
......@@ -138,6 +143,7 @@
CDA5542725EF734200A2E08C /* TodayCellFactory.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TodayCellFactory.swift; sourceTree = "<group>"; };
CDA5542C25EF7C9700A2E08C /* ReusableCellProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReusableCellProtocol.swift; sourceTree = "<group>"; };
CDA5542F25EFA13F00A2E08C /* Measurement+String.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Measurement+String.swift"; sourceTree = "<group>"; };
CDB8AA2125FB76FF00BF4D22 /* PeriodButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PeriodButton.swift; sourceTree = "<group>"; };
CDC6124E25E7964700188DA7 /* CityDayTimesCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CityDayTimesCell.swift; sourceTree = "<group>"; };
CDC6125225E79C8F00188DA7 /* DayTimeView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DayTimeView.swift; sourceTree = "<group>"; };
CDC6125625E7AB1A00188DA7 /* CityAirQualityCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CityAirQualityCell.swift; sourceTree = "<group>"; };
......@@ -152,7 +158,7 @@
CDE18DCC25D1666700C80ED9 /* ForecastCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ForecastCoordinator.swift; sourceTree = "<group>"; };
CDE18DD025D166F900C80ED9 /* ForecastViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ForecastViewController.swift; sourceTree = "<group>"; };
CDE18DD725D16CB200C80ED9 /* NavigationCityButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NavigationCityButton.swift; sourceTree = "<group>"; };
CDEE8AD625DA882200C289DE /* PeriodForecastButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PeriodForecastButton.swift; sourceTree = "<group>"; };
CDEE8AD625DA882200C289DE /* ForecastPeriodButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ForecastPeriodButton.swift; sourceTree = "<group>"; };
CE578FD225F7E89400E8B85D /* DayTimeWeather.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DayTimeWeather.swift; sourceTree = "<group>"; };
CE9D181525ECB8370028D9D7 /* MulticastDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MulticastDelegate.swift; sourceTree = "<group>"; };
CE9D181825ECB9A70028D9D7 /* Logger.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Logger.swift; sourceTree = "<group>"; };
......@@ -200,6 +206,21 @@
path = Pods;
sourceTree = "<group>";
};
CD0A2CC325FA5857006148A4 /* ForecastTimePeriod */ = {
isa = PBXGroup;
children = (
CD9B6B1325DBCDE2001D9B80 /* GraphView.swift */,
CDC6126525E9085600188DA7 /* GraphLine.swift */,
CDC6126925E90C8800188DA7 /* GraphLineSettings.swift */,
CD71708F25FA317700A63C27 /* ForecastTimePeriodView.swift */,
CDEE8AD625DA882200C289DE /* ForecastPeriodButton.swift */,
CD3F6E6825FA59D4002DB99B /* ForecastDetailPeriodButton.swift */,
CD3F6E6B25FA5A90002DB99B /* PeriodButtonProtocol.swift */,
CDB8AA2125FB76FF00BF4D22 /* PeriodButton.swift */,
);
path = ForecastTimePeriod;
sourceTree = "<group>";
};
CD1237B6255D5C5900C98139 = {
isa = PBXGroup;
children = (
......@@ -321,15 +342,15 @@
isa = PBXGroup;
children = (
CDA5542725EF734200A2E08C /* TodayCellFactory.swift */,
CD822FFD25D6976F00A05501 /* TodayAdCell.swift */,
CD822FF425D6817000A05501 /* CityForecastCell.swift */,
CD15DB4125DA806C00024727 /* CityForecastTimePeriodCell.swift */,
CD82300125D69DB900A05501 /* CityConditions */,
CDEE8AD425DA87DD00C289DE /* CityForecastTimePeriod */,
CD86246325E66E6B0097F3FB /* CityPrecipCell */,
CD86245B25E646000097F3FB /* CitySunCell */,
CDC6126025E8DA2900188DA7 /* CityMoonCell */,
CDC6124D25E7960D00188DA7 /* CityDayTimesCell */,
CDC6125525E7AAF600188DA7 /* CityAirQualityCell */,
CD822FF425D6817000A05501 /* CityForecastCell.swift */,
CD822FFD25D6976F00A05501 /* TodayAdCell.swift */,
);
path = Cells;
sourceTree = "<group>";
......@@ -430,16 +451,13 @@
CDD0F1F025725BD700CF5017 /* Helpers */ = {
isa = PBXGroup;
children = (
CD0A2CC325FA5857006148A4 /* ForecastTimePeriod */,
CD6B304125726ABE004B34B3 /* Themes */,
CD1237F3255D889F00C98139 /* GradientView.swift */,
CDD0F1E72572429E00CF5017 /* AppFont.swift */,
CDD0F1ED25725BCF00CF5017 /* ThemeManager.swift */,
CD9B6B1025DBC723001D9B80 /* CubicCurveAlgorithm.swift */,
CD9B6B1325DBCDE2001D9B80 /* GraphView.swift */,
CDC6126525E9085600188DA7 /* GraphLine.swift */,
CD86246B25E6826A0097F3FB /* InnerShadowLayer.swift */,
CDC6126925E90C8800188DA7 /* GraphLineSettings.swift */,
CD71708F25FA317700A63C27 /* ForecastTimePeriodView.swift */,
);
path = Helpers;
sourceTree = "<group>";
......@@ -453,15 +471,6 @@
path = Forecast;
sourceTree = "<group>";
};
CDEE8AD425DA87DD00C289DE /* CityForecastTimePeriod */ = {
isa = PBXGroup;
children = (
CD15DB4125DA806C00024727 /* CityForecastTimePeriodCell.swift */,
CDEE8AD625DA882200C289DE /* PeriodForecastButton.swift */,
);
path = CityForecastTimePeriod;
sourceTree = "<group>";
};
CE9D181425ECB8370028D9D7 /* Common */ = {
isa = PBXGroup;
children = (
......@@ -663,6 +672,7 @@
buildActionMask = 2147483647;
files = (
CD82300325D69DE400A05501 /* CityConditionsCell.swift in Sources */,
CDB8AA2225FB76FF00BF4D22 /* PeriodButton.swift in Sources */,
CEC526FD25E795F700DA58A5 /* WdtWeatherSource.swift in Sources */,
CEAFF09225DFC71D00DF4EBF /* HelperTypes.swift in Sources */,
CDA5543025EFA13F00A2E08C /* Measurement+String.swift in Sources */,
......@@ -696,7 +706,7 @@
CDC6125725E7AB1A00188DA7 /* CityAirQualityCell.swift in Sources */,
CD6B3036257262C2004B34B3 /* UIColor+Highlight.swift in Sources */,
CEDE4E8425EEFD56007457E9 /* WdtDailySummariesArray.swift in Sources */,
CDEE8AD725DA882200C289DE /* PeriodForecastButton.swift in Sources */,
CDEE8AD725DA882200C289DE /* ForecastPeriodButton.swift in Sources */,
CDE18DD125D166F900C80ED9 /* ForecastViewController.swift in Sources */,
CD39F2F525DE9571009FE398 /* ArrowButton.swift in Sources */,
CD71709325FA31C200A63C27 /* ForecastTimePeriod.swift in Sources */,
......@@ -704,6 +714,7 @@
CD8E041625F8F91B001785B6 /* ForecastCellFactory.swift in Sources */,
CDC6125325E79C8F00188DA7 /* DayTimeView.swift in Sources */,
CD86246925E672A20097F3FB /* PrecipButton.swift in Sources */,
CD3F6E6C25FA5A90002DB99B /* PeriodButtonProtocol.swift in Sources */,
CEDE4E8225EEFD56007457E9 /* WdtWeatherCode.swift in Sources */,
CE9D181625ECB8370028D9D7 /* MulticastDelegate.swift in Sources */,
CD82300A25D6B2AF00A05501 /* AppTabBarController.swift in Sources */,
......@@ -725,6 +736,7 @@
CD86246525E66E8A0097F3FB /* CityPrecipCell.swift in Sources */,
CD80917B2578E4A8003541A4 /* UIViewController+Alert.swift in Sources */,
CEDE4F0F25EFA3B4007457E9 /* UpdatableModelObjectInTime.swift in Sources */,
CD3F6E6925FA59D4002DB99B /* ForecastDetailPeriodButton.swift in Sources */,
CD17C5F625D15B4400EE884E /* TodayViewController.swift in Sources */,
CD86245E25E646350097F3FB /* SunUvView.swift in Sources */,
CEAFF08325DFC67F00DF4EBF /* Location.swift in Sources */,
......
......@@ -7,7 +7,7 @@
<key>1Weather.xcscheme_^#shared#^_</key>
<dict>
<key>orderHint</key>
<integer>6</integer>
<integer>5</integer>
</dict>
<key>PG (Playground) 1.xcscheme</key>
<dict>
......
//
// ForecastDetailPeriodButton.swift
// 1Weather
//
// Created by Dmitry Stepanets on 11.03.2021.
//
import UIKit
class ForecastDetailPeriodButton: PeriodButton {
required init() {
super.init()
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func configure(dailyWeather: DailyWeather) {
//
}
override func configure(hourlyWeather: HourlyWeather) {
//
}
}
//
// PeriodForecastButton.swift
// ForecastPeriodButton.swift
// 1Weather
//
// Created by Dmitry Stepanets on 15.02.2021.
......@@ -7,14 +7,14 @@
import UIKit
class PeriodForecastButton: UIControl {
class ForecastPeriodButton: PeriodButton {
//Private
private static let hourlyFormatter: DateFormatter = {
private let hourlyFormatter: DateFormatter = {
let fmt = DateFormatter()
fmt.dateFormat = "h a"
return fmt
}()
private static let dailyFormatter: DateFormatter = {
private let dailyFormatter: DateFormatter = {
let fmt = DateFormatter()
fmt.dateFormat = "d, E"
return fmt
......@@ -27,7 +27,6 @@ class PeriodForecastButton: UIControl {
private let timeLabel = UILabel()
//Public
var index:Int = -1
var graphRect:CGRect {
let topInset = self.tempLabel.frame.origin.y + self.tempLabel.frame.size.height + kGraphInset
......@@ -37,15 +36,15 @@ class PeriodForecastButton: UIControl {
height: self.minTempLabel.frame.origin.y - self.tempLabel.frame.origin.y - tempLabel.frame.height)
}
override init(frame: CGRect) {
super.init(frame: .zero)
required init() {
super.init()
prepareButton()
prepareForecastImage()
prepareTempLabel()
prepareMinTempLabel()
preparePeriodIndicator()
prepareTimeLabel()
preparePeriodIndicator()
prepareMinTempLabel()
}
required init?(coder: NSCoder) {
......@@ -80,7 +79,7 @@ class PeriodForecastButton: UIControl {
}
//Public
public func configure(dailyWeather: DailyWeather) {
override func configure(dailyWeather: DailyWeather) {
self.tempLabel.text = dailyWeather.maxTemp?.shortString
self.minTempLabel.text = dailyWeather.minTemp?.shortString
self.indicatorImageView.image = nil
......@@ -89,19 +88,19 @@ class PeriodForecastButton: UIControl {
self.timeLabel.text = "day.today".localized()
}
else {
self.timeLabel.text = PeriodForecastButton.dailyFormatter.string(from: dailyWeather.date)
self.timeLabel.text = dailyFormatter.string(from: dailyWeather.date)
}
}
public func configure(hourlyWeather: HourlyWeather) {
override func configure(hourlyWeather: HourlyWeather) {
self.tempLabel.text = hourlyWeather.temp?.shortString
self.minTempLabel.text = nil
self.indicatorImageView.image = nil
self.timeLabel.text = PeriodForecastButton.hourlyFormatter.string(from: hourlyWeather.date)
self.timeLabel.text = hourlyFormatter.string(from: hourlyWeather.date)
}
}
private extension PeriodForecastButton {
private extension ForecastPeriodButton {
func prepareButton() {
clipsToBounds = false
backgroundColor = UIColor.white
......@@ -143,7 +142,7 @@ private extension PeriodForecastButton {
minTempLabel.snp.makeConstraints { (make) in
make.centerX.equalToSuperview()
make.top.greaterThanOrEqualTo(tempLabel.snp.bottom).offset(55)
make.bottom.equalTo(indicatorImageView.snp.top).offset(-10)
}
}
......@@ -156,7 +155,7 @@ private extension PeriodForecastButton {
indicatorImageView.snp.makeConstraints { (make) in
make.width.height.equalTo(12)
make.centerX.equalToSuperview()
make.top.equalTo(minTempLabel.snp.bottom).offset(10)
make.bottom.equalTo(timeLabel.snp.top).offset(-15)
}
}
......@@ -168,7 +167,6 @@ private extension PeriodForecastButton {
addSubview(timeLabel)
timeLabel.snp.makeConstraints { (make) in
make.top.equalTo(indicatorImageView.snp.bottom).offset(15)
make.centerX.equalToSuperview()
make.bottom.equalToSuperview().inset(20)
}
......
......@@ -20,6 +20,8 @@ class ForecastTimePeriodView: UIView {
//Private
private let scrollView = UIScrollView()
private let stackView = UIStackView()
private let buttonType:PeriodButton.Type
private var buttonProtocol:PeriodButtonProtocol.Type!
private let graphView = GraphView()
private var graphRect:CGRect = .zero
private var currentTimePeriod = TimePeriod.daily
......@@ -31,7 +33,9 @@ class ForecastTimePeriodView: UIView {
}
}
init() {
//MARK:- View life cycle
init<T: PeriodButton>(buttonType: T.Type) {
self.buttonType = buttonType
super.init(frame: .zero)
preapreView()
......@@ -40,6 +44,12 @@ class ForecastTimePeriodView: UIView {
prepareGraphView()
}
convenience init<T: PeriodButtonProtocol>(buttonProtocol: T) {
self.init(buttonType: PeriodButton.self)
self.buttonProtocol = T.self
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
......@@ -55,6 +65,14 @@ class ForecastTimePeriodView: UIView {
}
//Private
private func createButton<T: PeriodButton>(typeThing:T.Type) -> T {
return typeThing.init()
}
private func createFromProtocol<T: PeriodButtonProtocol>(typeThing: T.Type) -> T {
return typeThing.init()
}
private func rebuildButtons() {
stackView.arrangedSubviews.forEach {
stackView.removeArrangedSubview($0)
......@@ -64,21 +82,29 @@ class ForecastTimePeriodView: UIView {
switch currentTimePeriod {
case .daily:
for index in 0..<forecastTimePeriod.daily.count {
let forecastButton = PeriodForecastButton()
let forecastButton = self.createButton(typeThing: buttonType)
forecastButton.configure(dailyWeather: forecastTimePeriod.daily[index])
forecastButton.index = index
forecastButton.addTarget(self, action: #selector(handleForecastButton(button:)), for: .touchUpInside)
forecastButton.isSelected = index == 1
stackView.addArrangedSubview(forecastButton)
forecastButton.snp.makeConstraints { (make) in
make.height.equalToSuperview()
}
}
case .hourly:
for index in 0..<forecastTimePeriod.hourly.count {
let forecastButton = PeriodForecastButton()
let forecastButton = self.createButton(typeThing: buttonType)
forecastButton.configure(hourlyWeather: forecastTimePeriod.hourly[index])
forecastButton.index = index
forecastButton.addTarget(self, action: #selector(handleForecastButton(button:)), for: .touchUpInside)
forecastButton.isSelected = index == 1
stackView.addArrangedSubview(forecastButton)
forecastButton.snp.makeConstraints { (make) in
make.height.equalToSuperview()
}
}
}
stackView.layoutIfNeeded()
......@@ -87,7 +113,7 @@ class ForecastTimePeriodView: UIView {
private func updateGraphLayout() {
print("[ForecastTimePeriod] Update graph layout")
graphRect = (stackView.arrangedSubviews.first as? PeriodForecastButton)?.graphRect ?? .zero
graphRect = (stackView.arrangedSubviews.first as? ForecastPeriodButton)?.graphRect ?? .zero
graphView.frame = .init(x: 0,
y: graphRect.origin.y,
width: stackView.frame.width,
......@@ -116,7 +142,7 @@ class ForecastTimePeriodView: UIView {
var maxPoints = [CGPoint]()
var minPoints = [CGPoint]()
for index in 0..<daysCount {
guard let stackButton = stackView.arrangedSubviews[index] as? PeriodForecastButton else { continue }
guard let stackButton = stackView.arrangedSubviews[index] as? ForecastPeriodButton else { continue }
let buttonRightSide = stackButton.frame.origin.x + stackButton.bounds.width
let buttonCenterX = (buttonRightSide + stackButton.frame.origin.x) / 2
......@@ -152,7 +178,7 @@ class ForecastTimePeriodView: UIView {
var points = [CGPoint]()
for index in 0..<hoursCount {
guard let stackButton = stackView.arrangedSubviews[index] as? PeriodForecastButton else { continue }
guard let stackButton = stackView.arrangedSubviews[index] as? ForecastPeriodButton else { continue }
let buttonRightSide = stackButton.frame.origin.x + stackButton.bounds.width
let buttonCenterX = (buttonRightSide + stackButton.frame.origin.x) / 2
......@@ -173,7 +199,7 @@ class ForecastTimePeriodView: UIView {
private func drawGraph() {
guard
let periodButtons = stackView.arrangedSubviews as? [PeriodForecastButton],
let periodButtons = stackView.arrangedSubviews as? [ForecastPeriodButton],
let selectedButton = (periodButtons.first{ $0.isSelected })
else {
return
......@@ -193,7 +219,7 @@ class ForecastTimePeriodView: UIView {
print("[ForecastTimePeriod] Draw graph")
}
private func tintGraphAt(button:PeriodForecastButton) {
private func tintGraphAt(button:ForecastPeriodButton) {
switch currentTimePeriod {
case .daily:
self.graphView.tintGraphFrom(startPointX: button.frame.origin.x,
......@@ -207,9 +233,9 @@ class ForecastTimePeriodView: UIView {
}
}
@objc private func handleForecastButton(button:PeriodForecastButton) {
@objc private func handleForecastButton(button:ForecastPeriodButton) {
stackView.arrangedSubviews.forEach {
if let periodButton = $0 as? PeriodForecastButton {
if let periodButton = $0 as? ForecastPeriodButton {
periodButton.isSelected = periodButton === button
if periodButton.isSelected {
......
//
// PeriodButton.swift
// 1Weather
//
// Created by Dmitry Stepanets on 12.03.2021.
//
import UIKit
class PeriodButton: UIControl {
//Public
public var index:Int = -1
required init() {
super.init(frame: .zero)
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
public func configure(dailyWeather: DailyWeather) {
}
public func configure(hourlyWeather: HourlyWeather) {
}
}
//
// PeriodButtonProtocol.swift
// 1Weather
//
// Created by Dmitry Stepanets on 11.03.2021.
//
import UIKit
public protocol PeriodButtonProtocol {
init()
func configure(dailyWeather: DailyWeather)
func configure(hourlyWeather: HourlyWeather)
}
struct PeriodButtonType: PeriodButtonProtocol {
func configure(dailyWeather: DailyWeather) {}
func configure(hourlyWeather: HourlyWeather) {}
}
......@@ -39,6 +39,7 @@ class ForecastCellFactory {
switch cellType {
case .forecastPeriod:
let cell = dequeueReusableCell(type: ForecastTimePeriodCell.self, tableView: tableView, indexPath: indexPath)
cell.configure(with: loc)
return cell
}
}
......
......@@ -12,6 +12,7 @@ class ForecastTimePeriodCell: UITableViewCell {
private let periodSegmentedControl = ForecastTimePeriodControl(items: ["forecast.timePeriod.daily".localized(),
"forecast.timePeriod.hourly".localized()])
private let forecastTimePeriodView = ForecastTimePeriodView(buttonType: ForecastDetailPeriodButton.self)
private let gradientView = GradientView(startColor: UIColor(hex: 0xffffff).withAlphaComponent(0),
endColor: UIColor(hex: 0xdaddec),
opacity: 0.5)
......@@ -22,6 +23,7 @@ class ForecastTimePeriodCell: UITableViewCell {
prepareCell()
prepareSegmentedControl()
prepareGradient()
prepareForecastTimePeriodView()
}
required init?(coder: NSCoder) {
......@@ -30,6 +32,8 @@ class ForecastTimePeriodCell: UITableViewCell {
//Public
public func configure(with location:Location) {
let forecastTimePeriod = ForecastTimePeriod(daily: location.daily, hourly: location.hourly)
self.forecastTimePeriodView.set(forecastTimePeriod: forecastTimePeriod)
}
@objc private func handleSegmentDidChange() {
......@@ -55,6 +59,17 @@ private extension ForecastTimePeriodCell {
}
}
func prepareForecastTimePeriodView() {
contentView.addSubview(forecastTimePeriodView)
forecastTimePeriodView.snp.makeConstraints { (make) in
make.left.equalToSuperview()
make.right.equalToSuperview()
make.top.equalTo(periodSegmentedControl.snp.bottom).offset(20).priority(.medium)
make.bottom.equalToSuperview().inset(30)
make.height.equalTo(267)
}
}
func prepareGradient() {
contentView.addSubview(gradientView)
gradientView.snp.makeConstraints { (make) in
......
......@@ -11,7 +11,7 @@ class CityForecastTimePeriodCell: UITableViewCell {
//Private
private let periodSegmentedControl = ForecastTimePeriodControl(items: ["forecast.timePeriod.daily".localized(),
"forecast.timePeriod.hourly".localized()])
private let forecastTimePeriodView = ForecastTimePeriodView()
private let forecastTimePeriodView = ForecastTimePeriodView(buttonType: ForecastPeriodButton.self)
private let summaryView = UIView()
private let summaryImageView = UIImageView()
private let summaryLabel = UILabel()
......
......@@ -52,7 +52,7 @@
<key>XMLCoder.xcscheme_^#shared#^_</key>
<dict>
<key>orderHint</key>
<integer>5</integer>
<integer>6</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