Commit 11ba9772 by Dmitriy Stepanets

Added generic initialization for the period button

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