diff --git a/JeonHyowon-assignment/JeonHyowon-assignment/MainViewController.swift b/JeonHyowon-assignment/JeonHyowon-assignment/MainViewController.swift deleted file mode 100644 index 89db960..0000000 --- a/JeonHyowon-assignment/JeonHyowon-assignment/MainViewController.swift +++ /dev/null @@ -1,127 +0,0 @@ -// -// MainViewController.swift -// JeonHyowon-assignment -// -// Created by Hyowon Jeon on 10/25/23. -// - -import UIKit - -import SnapKit -import Then - -class MainViewController: UIViewController { - - let cityList: [String] = ["seoul", "jeju", "gwangju", "daegu", "cheonan"] - - private var settingButton = UIButton().then { - $0.setImage(UIImage(named: "icon_setting"), for: .normal) - } - - private var weatherLabel = UILabel().then { - $0.text = "날씨" - $0.font = UIFont(name: "SFProDisplay-Bold", size: 36) - $0.textColor = .white - } - - private var searchBar = UISearchBar().then { - $0.placeholder = "도시 또는 공항 검색" - $0.clipsToBounds = true - $0.layer.cornerRadius = 10 - $0.setImage(UIImage(named: "icon_search"), for: .search, state: .normal) - $0.searchBarStyle = .minimal - } - - private lazy var tableView = UITableView(frame: .zero, style: .plain).then { - $0.backgroundColor = .clear - $0.clipsToBounds = true - $0.sectionHeaderTopPadding = 0 - $0.delegate = self - $0.dataSource = self - $0.register(LocationTableViewCell.self, forCellReuseIdentifier: LocationTableViewCell.identifier) - } - - override func viewDidLoad() { - super.viewDidLoad() - self.view.backgroundColor = .black - - self.navigationController?.navigationBar.isHidden = true - - setLayout() - } - - override func touchesBegan(_ touches: Set, with event: UIEvent?) { - self.view.endEditing(true) - } -} - -extension MainViewController: UITableViewDelegate { - func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { - self.navigationController?.pushViewController(WeatherDetailViewController(), animated: true) - } - - func tableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> UIView? { - return UIView() - } - - func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat { - return 16 - } -} - -extension MainViewController: UITableViewDataSource { - func numberOfSections(in tableView: UITableView) -> Int { - return cityList.count - } - func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { - return 1 - } - - func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { - guard let cell = tableView.dequeueReusableCell( - withIdentifier: LocationTableViewCell.identifier, - for: indexPath - ) as? LocationTableViewCell else {return UITableViewCell()} - - cell.selectionStyle = .none - cell.bindData(city: cityList[indexPath.section]) - return cell - } -} - -private extension MainViewController { - func setLayout() { - [ - settingButton, - weatherLabel, - searchBar, - tableView - ].forEach { - view.addSubview($0) - } - - settingButton.snp.makeConstraints { - $0.top.equalTo(view.safeAreaLayoutGuide).offset(8) - $0.trailing.equalToSuperview().inset(10) - $0.size.equalTo(44) - } - - weatherLabel.snp.makeConstraints { - $0.top.equalTo(view.safeAreaLayoutGuide).offset(53) - $0.leading.equalToSuperview().inset(20) - } - - searchBar.snp.makeConstraints { - $0.top.equalTo(weatherLabel.snp.bottom).offset(8) - $0.leading.trailing.equalToSuperview().inset(20) - $0.height.equalTo(40) - } - - tableView.snp.makeConstraints { - $0.top.equalTo(searchBar.snp.bottom).offset(15) - $0.leading.trailing.equalToSuperview().inset(16) - $0.bottom.equalToSuperview() - } - } -} - diff --git a/JeonHyowon-assignment/JeonHyowon-assignment/Assets.xcassets/AccentColor.colorset/Contents.json b/JeonHyowon-assignment/JeonHyowon-assignment/Resource/Assets.xcassets/AccentColor.colorset/Contents.json similarity index 100% rename from JeonHyowon-assignment/JeonHyowon-assignment/Assets.xcassets/AccentColor.colorset/Contents.json rename to JeonHyowon-assignment/JeonHyowon-assignment/Resource/Assets.xcassets/AccentColor.colorset/Contents.json diff --git a/JeonHyowon-assignment/JeonHyowon-assignment/Assets.xcassets/AppIcon.appiconset/Contents.json b/JeonHyowon-assignment/JeonHyowon-assignment/Resource/Assets.xcassets/AppIcon.appiconset/Contents.json similarity index 100% rename from JeonHyowon-assignment/JeonHyowon-assignment/Assets.xcassets/AppIcon.appiconset/Contents.json rename to JeonHyowon-assignment/JeonHyowon-assignment/Resource/Assets.xcassets/AppIcon.appiconset/Contents.json diff --git a/JeonHyowon-assignment/JeonHyowon-assignment/Assets.xcassets/AppIcon.appiconset/weather.png b/JeonHyowon-assignment/JeonHyowon-assignment/Resource/Assets.xcassets/AppIcon.appiconset/weather.png similarity index 100% rename from JeonHyowon-assignment/JeonHyowon-assignment/Assets.xcassets/AppIcon.appiconset/weather.png rename to JeonHyowon-assignment/JeonHyowon-assignment/Resource/Assets.xcassets/AppIcon.appiconset/weather.png diff --git a/JeonHyowon-assignment/JeonHyowon-assignment/Assets.xcassets/Contents.json b/JeonHyowon-assignment/JeonHyowon-assignment/Resource/Assets.xcassets/Contents.json similarity index 100% rename from JeonHyowon-assignment/JeonHyowon-assignment/Assets.xcassets/Contents.json rename to JeonHyowon-assignment/JeonHyowon-assignment/Resource/Assets.xcassets/Contents.json diff --git a/JeonHyowon-assignment/JeonHyowon-assignment/Assets.xcassets/Img.imageset/Contents.json b/JeonHyowon-assignment/JeonHyowon-assignment/Resource/Assets.xcassets/Img.imageset/Contents.json similarity index 100% rename from JeonHyowon-assignment/JeonHyowon-assignment/Assets.xcassets/Img.imageset/Contents.json rename to JeonHyowon-assignment/JeonHyowon-assignment/Resource/Assets.xcassets/Img.imageset/Contents.json diff --git a/JeonHyowon-assignment/JeonHyowon-assignment/Assets.xcassets/Img.imageset/Img.png b/JeonHyowon-assignment/JeonHyowon-assignment/Resource/Assets.xcassets/Img.imageset/Img.png similarity index 100% rename from JeonHyowon-assignment/JeonHyowon-assignment/Assets.xcassets/Img.imageset/Img.png rename to JeonHyowon-assignment/JeonHyowon-assignment/Resource/Assets.xcassets/Img.imageset/Img.png diff --git a/JeonHyowon-assignment/JeonHyowon-assignment/Assets.xcassets/icon_calendar.imageset/Contents.json b/JeonHyowon-assignment/JeonHyowon-assignment/Resource/Assets.xcassets/icon_calendar.imageset/Contents.json similarity index 100% rename from JeonHyowon-assignment/JeonHyowon-assignment/Assets.xcassets/icon_calendar.imageset/Contents.json rename to JeonHyowon-assignment/JeonHyowon-assignment/Resource/Assets.xcassets/icon_calendar.imageset/Contents.json diff --git a/JeonHyowon-assignment/JeonHyowon-assignment/Assets.xcassets/icon_calendar.imageset/icon_calendar.png b/JeonHyowon-assignment/JeonHyowon-assignment/Resource/Assets.xcassets/icon_calendar.imageset/icon_calendar.png similarity index 100% rename from JeonHyowon-assignment/JeonHyowon-assignment/Assets.xcassets/icon_calendar.imageset/icon_calendar.png rename to JeonHyowon-assignment/JeonHyowon-assignment/Resource/Assets.xcassets/icon_calendar.imageset/icon_calendar.png diff --git a/JeonHyowon-assignment/JeonHyowon-assignment/Assets.xcassets/icon_cloudy.imageset/Contents.json b/JeonHyowon-assignment/JeonHyowon-assignment/Resource/Assets.xcassets/icon_cloudy.imageset/Contents.json similarity index 100% rename from JeonHyowon-assignment/JeonHyowon-assignment/Assets.xcassets/icon_cloudy.imageset/Contents.json rename to JeonHyowon-assignment/JeonHyowon-assignment/Resource/Assets.xcassets/icon_cloudy.imageset/Contents.json diff --git a/JeonHyowon-assignment/JeonHyowon-assignment/Assets.xcassets/icon_cloudy.imageset/Frame 2.svg b/JeonHyowon-assignment/JeonHyowon-assignment/Resource/Assets.xcassets/icon_cloudy.imageset/Frame 2.svg similarity index 100% rename from JeonHyowon-assignment/JeonHyowon-assignment/Assets.xcassets/icon_cloudy.imageset/Frame 2.svg rename to JeonHyowon-assignment/JeonHyowon-assignment/Resource/Assets.xcassets/icon_cloudy.imageset/Frame 2.svg diff --git a/JeonHyowon-assignment/JeonHyowon-assignment/Assets.xcassets/icon_dot.imageset/Contents.json b/JeonHyowon-assignment/JeonHyowon-assignment/Resource/Assets.xcassets/icon_dot.imageset/Contents.json similarity index 100% rename from JeonHyowon-assignment/JeonHyowon-assignment/Assets.xcassets/icon_dot.imageset/Contents.json rename to JeonHyowon-assignment/JeonHyowon-assignment/Resource/Assets.xcassets/icon_dot.imageset/Contents.json diff --git a/JeonHyowon-assignment/JeonHyowon-assignment/Assets.xcassets/icon_dot.imageset/Frame 11.svg b/JeonHyowon-assignment/JeonHyowon-assignment/Resource/Assets.xcassets/icon_dot.imageset/Frame 11.svg similarity index 100% rename from JeonHyowon-assignment/JeonHyowon-assignment/Assets.xcassets/icon_dot.imageset/Frame 11.svg rename to JeonHyowon-assignment/JeonHyowon-assignment/Resource/Assets.xcassets/icon_dot.imageset/Frame 11.svg diff --git a/JeonHyowon-assignment/JeonHyowon-assignment/Assets.xcassets/icon_heavyrain.imageset/Contents.json b/JeonHyowon-assignment/JeonHyowon-assignment/Resource/Assets.xcassets/icon_heavyrain.imageset/Contents.json similarity index 100% rename from JeonHyowon-assignment/JeonHyowon-assignment/Assets.xcassets/icon_heavyrain.imageset/Contents.json rename to JeonHyowon-assignment/JeonHyowon-assignment/Resource/Assets.xcassets/icon_heavyrain.imageset/Contents.json diff --git a/JeonHyowon-assignment/JeonHyowon-assignment/Assets.xcassets/icon_heavyrain.imageset/Frame 4.svg b/JeonHyowon-assignment/JeonHyowon-assignment/Resource/Assets.xcassets/icon_heavyrain.imageset/Frame 4.svg similarity index 100% rename from JeonHyowon-assignment/JeonHyowon-assignment/Assets.xcassets/icon_heavyrain.imageset/Frame 4.svg rename to JeonHyowon-assignment/JeonHyowon-assignment/Resource/Assets.xcassets/icon_heavyrain.imageset/Frame 4.svg diff --git a/JeonHyowon-assignment/JeonHyowon-assignment/Assets.xcassets/icon_lightning.imageset/Contents.json b/JeonHyowon-assignment/JeonHyowon-assignment/Resource/Assets.xcassets/icon_lightning.imageset/Contents.json similarity index 100% rename from JeonHyowon-assignment/JeonHyowon-assignment/Assets.xcassets/icon_lightning.imageset/Contents.json rename to JeonHyowon-assignment/JeonHyowon-assignment/Resource/Assets.xcassets/icon_lightning.imageset/Contents.json diff --git a/JeonHyowon-assignment/JeonHyowon-assignment/Assets.xcassets/icon_lightning.imageset/Frame 5.svg b/JeonHyowon-assignment/JeonHyowon-assignment/Resource/Assets.xcassets/icon_lightning.imageset/Frame 5.svg similarity index 100% rename from JeonHyowon-assignment/JeonHyowon-assignment/Assets.xcassets/icon_lightning.imageset/Frame 5.svg rename to JeonHyowon-assignment/JeonHyowon-assignment/Resource/Assets.xcassets/icon_lightning.imageset/Frame 5.svg diff --git a/JeonHyowon-assignment/JeonHyowon-assignment/Assets.xcassets/icon_location.imageset/Contents.json b/JeonHyowon-assignment/JeonHyowon-assignment/Resource/Assets.xcassets/icon_location.imageset/Contents.json similarity index 100% rename from JeonHyowon-assignment/JeonHyowon-assignment/Assets.xcassets/icon_location.imageset/Contents.json rename to JeonHyowon-assignment/JeonHyowon-assignment/Resource/Assets.xcassets/icon_location.imageset/Contents.json diff --git a/JeonHyowon-assignment/JeonHyowon-assignment/Assets.xcassets/icon_location.imageset/Frame 10.svg b/JeonHyowon-assignment/JeonHyowon-assignment/Resource/Assets.xcassets/icon_location.imageset/Frame 10.svg similarity index 100% rename from JeonHyowon-assignment/JeonHyowon-assignment/Assets.xcassets/icon_location.imageset/Frame 10.svg rename to JeonHyowon-assignment/JeonHyowon-assignment/Resource/Assets.xcassets/icon_location.imageset/Frame 10.svg diff --git a/JeonHyowon-assignment/JeonHyowon-assignment/Assets.xcassets/icon_map.imageset/Contents.json b/JeonHyowon-assignment/JeonHyowon-assignment/Resource/Assets.xcassets/icon_map.imageset/Contents.json similarity index 100% rename from JeonHyowon-assignment/JeonHyowon-assignment/Assets.xcassets/icon_map.imageset/Contents.json rename to JeonHyowon-assignment/JeonHyowon-assignment/Resource/Assets.xcassets/icon_map.imageset/Contents.json diff --git a/JeonHyowon-assignment/JeonHyowon-assignment/Assets.xcassets/icon_map.imageset/Frame 9.svg b/JeonHyowon-assignment/JeonHyowon-assignment/Resource/Assets.xcassets/icon_map.imageset/Frame 9.svg similarity index 100% rename from JeonHyowon-assignment/JeonHyowon-assignment/Assets.xcassets/icon_map.imageset/Frame 9.svg rename to JeonHyowon-assignment/JeonHyowon-assignment/Resource/Assets.xcassets/icon_map.imageset/Frame 9.svg diff --git a/JeonHyowon-assignment/JeonHyowon-assignment/Assets.xcassets/icon_menu.imageset/Contents.json b/JeonHyowon-assignment/JeonHyowon-assignment/Resource/Assets.xcassets/icon_menu.imageset/Contents.json similarity index 100% rename from JeonHyowon-assignment/JeonHyowon-assignment/Assets.xcassets/icon_menu.imageset/Contents.json rename to JeonHyowon-assignment/JeonHyowon-assignment/Resource/Assets.xcassets/icon_menu.imageset/Contents.json diff --git a/JeonHyowon-assignment/JeonHyowon-assignment/Assets.xcassets/icon_menu.imageset/Frame 12.svg b/JeonHyowon-assignment/JeonHyowon-assignment/Resource/Assets.xcassets/icon_menu.imageset/Frame 12.svg similarity index 100% rename from JeonHyowon-assignment/JeonHyowon-assignment/Assets.xcassets/icon_menu.imageset/Frame 12.svg rename to JeonHyowon-assignment/JeonHyowon-assignment/Resource/Assets.xcassets/icon_menu.imageset/Frame 12.svg diff --git a/JeonHyowon-assignment/JeonHyowon-assignment/Assets.xcassets/icon_rain.imageset/Contents.json b/JeonHyowon-assignment/JeonHyowon-assignment/Resource/Assets.xcassets/icon_rain.imageset/Contents.json similarity index 100% rename from JeonHyowon-assignment/JeonHyowon-assignment/Assets.xcassets/icon_rain.imageset/Contents.json rename to JeonHyowon-assignment/JeonHyowon-assignment/Resource/Assets.xcassets/icon_rain.imageset/Contents.json diff --git a/JeonHyowon-assignment/JeonHyowon-assignment/Assets.xcassets/icon_rain.imageset/Frame 3.svg b/JeonHyowon-assignment/JeonHyowon-assignment/Resource/Assets.xcassets/icon_rain.imageset/Frame 3.svg similarity index 100% rename from JeonHyowon-assignment/JeonHyowon-assignment/Assets.xcassets/icon_rain.imageset/Frame 3.svg rename to JeonHyowon-assignment/JeonHyowon-assignment/Resource/Assets.xcassets/icon_rain.imageset/Frame 3.svg diff --git a/JeonHyowon-assignment/JeonHyowon-assignment/Assets.xcassets/icon_search.imageset/Contents.json b/JeonHyowon-assignment/JeonHyowon-assignment/Resource/Assets.xcassets/icon_search.imageset/Contents.json similarity index 100% rename from JeonHyowon-assignment/JeonHyowon-assignment/Assets.xcassets/icon_search.imageset/Contents.json rename to JeonHyowon-assignment/JeonHyowon-assignment/Resource/Assets.xcassets/icon_search.imageset/Contents.json diff --git a/JeonHyowon-assignment/JeonHyowon-assignment/Assets.xcassets/icon_search.imageset/Frame 8.svg b/JeonHyowon-assignment/JeonHyowon-assignment/Resource/Assets.xcassets/icon_search.imageset/Frame 8.svg similarity index 100% rename from JeonHyowon-assignment/JeonHyowon-assignment/Assets.xcassets/icon_search.imageset/Frame 8.svg rename to JeonHyowon-assignment/JeonHyowon-assignment/Resource/Assets.xcassets/icon_search.imageset/Frame 8.svg diff --git a/JeonHyowon-assignment/JeonHyowon-assignment/Assets.xcassets/icon_setting.imageset/Contents.json b/JeonHyowon-assignment/JeonHyowon-assignment/Resource/Assets.xcassets/icon_setting.imageset/Contents.json similarity index 100% rename from JeonHyowon-assignment/JeonHyowon-assignment/Assets.xcassets/icon_setting.imageset/Contents.json rename to JeonHyowon-assignment/JeonHyowon-assignment/Resource/Assets.xcassets/icon_setting.imageset/Contents.json diff --git a/JeonHyowon-assignment/JeonHyowon-assignment/Assets.xcassets/icon_setting.imageset/Frame 7.svg b/JeonHyowon-assignment/JeonHyowon-assignment/Resource/Assets.xcassets/icon_setting.imageset/Frame 7.svg similarity index 100% rename from JeonHyowon-assignment/JeonHyowon-assignment/Assets.xcassets/icon_setting.imageset/Frame 7.svg rename to JeonHyowon-assignment/JeonHyowon-assignment/Resource/Assets.xcassets/icon_setting.imageset/Frame 7.svg diff --git a/JeonHyowon-assignment/JeonHyowon-assignment/Assets.xcassets/icon_sunshower.imageset/Contents.json b/JeonHyowon-assignment/JeonHyowon-assignment/Resource/Assets.xcassets/icon_sunshower.imageset/Contents.json similarity index 100% rename from JeonHyowon-assignment/JeonHyowon-assignment/Assets.xcassets/icon_sunshower.imageset/Contents.json rename to JeonHyowon-assignment/JeonHyowon-assignment/Resource/Assets.xcassets/icon_sunshower.imageset/Contents.json diff --git a/JeonHyowon-assignment/JeonHyowon-assignment/Assets.xcassets/icon_sunshower.imageset/Frame 6.svg b/JeonHyowon-assignment/JeonHyowon-assignment/Resource/Assets.xcassets/icon_sunshower.imageset/Frame 6.svg similarity index 100% rename from JeonHyowon-assignment/JeonHyowon-assignment/Assets.xcassets/icon_sunshower.imageset/Frame 6.svg rename to JeonHyowon-assignment/JeonHyowon-assignment/Resource/Assets.xcassets/icon_sunshower.imageset/Frame 6.svg diff --git a/JeonHyowon-assignment/JeonHyowon-assignment/Assets.xcassets/list.imageset/Contents.json b/JeonHyowon-assignment/JeonHyowon-assignment/Resource/Assets.xcassets/list.imageset/Contents.json similarity index 100% rename from JeonHyowon-assignment/JeonHyowon-assignment/Assets.xcassets/list.imageset/Contents.json rename to JeonHyowon-assignment/JeonHyowon-assignment/Resource/Assets.xcassets/list.imageset/Contents.json diff --git a/JeonHyowon-assignment/JeonHyowon-assignment/Assets.xcassets/list.imageset/list.png b/JeonHyowon-assignment/JeonHyowon-assignment/Resource/Assets.xcassets/list.imageset/list.png similarity index 100% rename from JeonHyowon-assignment/JeonHyowon-assignment/Assets.xcassets/list.imageset/list.png rename to JeonHyowon-assignment/JeonHyowon-assignment/Resource/Assets.xcassets/list.imageset/list.png diff --git a/JeonHyowon-assignment/JeonHyowon-assignment/Assets.xcassets/list.imageset/list@2x.png b/JeonHyowon-assignment/JeonHyowon-assignment/Resource/Assets.xcassets/list.imageset/list@2x.png similarity index 100% rename from JeonHyowon-assignment/JeonHyowon-assignment/Assets.xcassets/list.imageset/list@2x.png rename to JeonHyowon-assignment/JeonHyowon-assignment/Resource/Assets.xcassets/list.imageset/list@2x.png diff --git a/JeonHyowon-assignment/JeonHyowon-assignment/Assets.xcassets/list.imageset/list@3x.png b/JeonHyowon-assignment/JeonHyowon-assignment/Resource/Assets.xcassets/list.imageset/list@3x.png similarity index 100% rename from JeonHyowon-assignment/JeonHyowon-assignment/Assets.xcassets/list.imageset/list@3x.png rename to JeonHyowon-assignment/JeonHyowon-assignment/Resource/Assets.xcassets/list.imageset/list@3x.png diff --git a/JeonHyowon-assignment/JeonHyowon-assignment/Assets.xcassets/temperature1.imageset/Contents.json b/JeonHyowon-assignment/JeonHyowon-assignment/Resource/Assets.xcassets/temperature1.imageset/Contents.json similarity index 100% rename from JeonHyowon-assignment/JeonHyowon-assignment/Assets.xcassets/temperature1.imageset/Contents.json rename to JeonHyowon-assignment/JeonHyowon-assignment/Resource/Assets.xcassets/temperature1.imageset/Contents.json diff --git a/JeonHyowon-assignment/JeonHyowon-assignment/Assets.xcassets/temperature1.imageset/temperature1.svg b/JeonHyowon-assignment/JeonHyowon-assignment/Resource/Assets.xcassets/temperature1.imageset/temperature1.svg similarity index 100% rename from JeonHyowon-assignment/JeonHyowon-assignment/Assets.xcassets/temperature1.imageset/temperature1.svg rename to JeonHyowon-assignment/JeonHyowon-assignment/Resource/Assets.xcassets/temperature1.imageset/temperature1.svg diff --git a/JeonHyowon-assignment/JeonHyowon-assignment/Assets.xcassets/temperature10.imageset/Contents.json b/JeonHyowon-assignment/JeonHyowon-assignment/Resource/Assets.xcassets/temperature10.imageset/Contents.json similarity index 100% rename from JeonHyowon-assignment/JeonHyowon-assignment/Assets.xcassets/temperature10.imageset/Contents.json rename to JeonHyowon-assignment/JeonHyowon-assignment/Resource/Assets.xcassets/temperature10.imageset/Contents.json diff --git a/JeonHyowon-assignment/JeonHyowon-assignment/Assets.xcassets/temperature10.imageset/temperature10.svg b/JeonHyowon-assignment/JeonHyowon-assignment/Resource/Assets.xcassets/temperature10.imageset/temperature10.svg similarity index 100% rename from JeonHyowon-assignment/JeonHyowon-assignment/Assets.xcassets/temperature10.imageset/temperature10.svg rename to JeonHyowon-assignment/JeonHyowon-assignment/Resource/Assets.xcassets/temperature10.imageset/temperature10.svg diff --git a/JeonHyowon-assignment/JeonHyowon-assignment/Assets.xcassets/temperature11.imageset/Contents.json b/JeonHyowon-assignment/JeonHyowon-assignment/Resource/Assets.xcassets/temperature11.imageset/Contents.json similarity index 100% rename from JeonHyowon-assignment/JeonHyowon-assignment/Assets.xcassets/temperature11.imageset/Contents.json rename to JeonHyowon-assignment/JeonHyowon-assignment/Resource/Assets.xcassets/temperature11.imageset/Contents.json diff --git a/JeonHyowon-assignment/JeonHyowon-assignment/Assets.xcassets/temperature11.imageset/temperature11.svg b/JeonHyowon-assignment/JeonHyowon-assignment/Resource/Assets.xcassets/temperature11.imageset/temperature11.svg similarity index 100% rename from JeonHyowon-assignment/JeonHyowon-assignment/Assets.xcassets/temperature11.imageset/temperature11.svg rename to JeonHyowon-assignment/JeonHyowon-assignment/Resource/Assets.xcassets/temperature11.imageset/temperature11.svg diff --git a/JeonHyowon-assignment/JeonHyowon-assignment/Assets.xcassets/temperature2.imageset/Contents.json b/JeonHyowon-assignment/JeonHyowon-assignment/Resource/Assets.xcassets/temperature2.imageset/Contents.json similarity index 100% rename from JeonHyowon-assignment/JeonHyowon-assignment/Assets.xcassets/temperature2.imageset/Contents.json rename to JeonHyowon-assignment/JeonHyowon-assignment/Resource/Assets.xcassets/temperature2.imageset/Contents.json diff --git a/JeonHyowon-assignment/JeonHyowon-assignment/Assets.xcassets/temperature2.imageset/temperature2.svg b/JeonHyowon-assignment/JeonHyowon-assignment/Resource/Assets.xcassets/temperature2.imageset/temperature2.svg similarity index 100% rename from JeonHyowon-assignment/JeonHyowon-assignment/Assets.xcassets/temperature2.imageset/temperature2.svg rename to JeonHyowon-assignment/JeonHyowon-assignment/Resource/Assets.xcassets/temperature2.imageset/temperature2.svg diff --git a/JeonHyowon-assignment/JeonHyowon-assignment/Assets.xcassets/temperature3.imageset/Contents.json b/JeonHyowon-assignment/JeonHyowon-assignment/Resource/Assets.xcassets/temperature3.imageset/Contents.json similarity index 100% rename from JeonHyowon-assignment/JeonHyowon-assignment/Assets.xcassets/temperature3.imageset/Contents.json rename to JeonHyowon-assignment/JeonHyowon-assignment/Resource/Assets.xcassets/temperature3.imageset/Contents.json diff --git a/JeonHyowon-assignment/JeonHyowon-assignment/Assets.xcassets/temperature3.imageset/temperature3.svg b/JeonHyowon-assignment/JeonHyowon-assignment/Resource/Assets.xcassets/temperature3.imageset/temperature3.svg similarity index 100% rename from JeonHyowon-assignment/JeonHyowon-assignment/Assets.xcassets/temperature3.imageset/temperature3.svg rename to JeonHyowon-assignment/JeonHyowon-assignment/Resource/Assets.xcassets/temperature3.imageset/temperature3.svg diff --git a/JeonHyowon-assignment/JeonHyowon-assignment/Assets.xcassets/temperature4.imageset/Contents.json b/JeonHyowon-assignment/JeonHyowon-assignment/Resource/Assets.xcassets/temperature4.imageset/Contents.json similarity index 100% rename from JeonHyowon-assignment/JeonHyowon-assignment/Assets.xcassets/temperature4.imageset/Contents.json rename to JeonHyowon-assignment/JeonHyowon-assignment/Resource/Assets.xcassets/temperature4.imageset/Contents.json diff --git a/JeonHyowon-assignment/JeonHyowon-assignment/Assets.xcassets/temperature4.imageset/temperature4.svg b/JeonHyowon-assignment/JeonHyowon-assignment/Resource/Assets.xcassets/temperature4.imageset/temperature4.svg similarity index 100% rename from JeonHyowon-assignment/JeonHyowon-assignment/Assets.xcassets/temperature4.imageset/temperature4.svg rename to JeonHyowon-assignment/JeonHyowon-assignment/Resource/Assets.xcassets/temperature4.imageset/temperature4.svg diff --git a/JeonHyowon-assignment/JeonHyowon-assignment/Assets.xcassets/temperature5.imageset/Contents.json b/JeonHyowon-assignment/JeonHyowon-assignment/Resource/Assets.xcassets/temperature5.imageset/Contents.json similarity index 100% rename from JeonHyowon-assignment/JeonHyowon-assignment/Assets.xcassets/temperature5.imageset/Contents.json rename to JeonHyowon-assignment/JeonHyowon-assignment/Resource/Assets.xcassets/temperature5.imageset/Contents.json diff --git a/JeonHyowon-assignment/JeonHyowon-assignment/Assets.xcassets/temperature5.imageset/temperature5.svg b/JeonHyowon-assignment/JeonHyowon-assignment/Resource/Assets.xcassets/temperature5.imageset/temperature5.svg similarity index 100% rename from JeonHyowon-assignment/JeonHyowon-assignment/Assets.xcassets/temperature5.imageset/temperature5.svg rename to JeonHyowon-assignment/JeonHyowon-assignment/Resource/Assets.xcassets/temperature5.imageset/temperature5.svg diff --git a/JeonHyowon-assignment/JeonHyowon-assignment/Assets.xcassets/temperature6.imageset/Contents.json b/JeonHyowon-assignment/JeonHyowon-assignment/Resource/Assets.xcassets/temperature6.imageset/Contents.json similarity index 100% rename from JeonHyowon-assignment/JeonHyowon-assignment/Assets.xcassets/temperature6.imageset/Contents.json rename to JeonHyowon-assignment/JeonHyowon-assignment/Resource/Assets.xcassets/temperature6.imageset/Contents.json diff --git a/JeonHyowon-assignment/JeonHyowon-assignment/Assets.xcassets/temperature6.imageset/temperature6.svg b/JeonHyowon-assignment/JeonHyowon-assignment/Resource/Assets.xcassets/temperature6.imageset/temperature6.svg similarity index 100% rename from JeonHyowon-assignment/JeonHyowon-assignment/Assets.xcassets/temperature6.imageset/temperature6.svg rename to JeonHyowon-assignment/JeonHyowon-assignment/Resource/Assets.xcassets/temperature6.imageset/temperature6.svg diff --git a/JeonHyowon-assignment/JeonHyowon-assignment/Assets.xcassets/temperature7.imageset/Contents.json b/JeonHyowon-assignment/JeonHyowon-assignment/Resource/Assets.xcassets/temperature7.imageset/Contents.json similarity index 100% rename from JeonHyowon-assignment/JeonHyowon-assignment/Assets.xcassets/temperature7.imageset/Contents.json rename to JeonHyowon-assignment/JeonHyowon-assignment/Resource/Assets.xcassets/temperature7.imageset/Contents.json diff --git a/JeonHyowon-assignment/JeonHyowon-assignment/Assets.xcassets/temperature7.imageset/temperature7.svg b/JeonHyowon-assignment/JeonHyowon-assignment/Resource/Assets.xcassets/temperature7.imageset/temperature7.svg similarity index 100% rename from JeonHyowon-assignment/JeonHyowon-assignment/Assets.xcassets/temperature7.imageset/temperature7.svg rename to JeonHyowon-assignment/JeonHyowon-assignment/Resource/Assets.xcassets/temperature7.imageset/temperature7.svg diff --git a/JeonHyowon-assignment/JeonHyowon-assignment/Assets.xcassets/temperature8.imageset/Contents.json b/JeonHyowon-assignment/JeonHyowon-assignment/Resource/Assets.xcassets/temperature8.imageset/Contents.json similarity index 100% rename from JeonHyowon-assignment/JeonHyowon-assignment/Assets.xcassets/temperature8.imageset/Contents.json rename to JeonHyowon-assignment/JeonHyowon-assignment/Resource/Assets.xcassets/temperature8.imageset/Contents.json diff --git a/JeonHyowon-assignment/JeonHyowon-assignment/Assets.xcassets/temperature8.imageset/temperature8.svg b/JeonHyowon-assignment/JeonHyowon-assignment/Resource/Assets.xcassets/temperature8.imageset/temperature8.svg similarity index 100% rename from JeonHyowon-assignment/JeonHyowon-assignment/Assets.xcassets/temperature8.imageset/temperature8.svg rename to JeonHyowon-assignment/JeonHyowon-assignment/Resource/Assets.xcassets/temperature8.imageset/temperature8.svg diff --git a/JeonHyowon-assignment/JeonHyowon-assignment/Assets.xcassets/temperature9.imageset/Contents.json b/JeonHyowon-assignment/JeonHyowon-assignment/Resource/Assets.xcassets/temperature9.imageset/Contents.json similarity index 100% rename from JeonHyowon-assignment/JeonHyowon-assignment/Assets.xcassets/temperature9.imageset/Contents.json rename to JeonHyowon-assignment/JeonHyowon-assignment/Resource/Assets.xcassets/temperature9.imageset/Contents.json diff --git a/JeonHyowon-assignment/JeonHyowon-assignment/Assets.xcassets/temperature9.imageset/temperature9.svg b/JeonHyowon-assignment/JeonHyowon-assignment/Resource/Assets.xcassets/temperature9.imageset/temperature9.svg similarity index 100% rename from JeonHyowon-assignment/JeonHyowon-assignment/Assets.xcassets/temperature9.imageset/temperature9.svg rename to JeonHyowon-assignment/JeonHyowon-assignment/Resource/Assets.xcassets/temperature9.imageset/temperature9.svg diff --git a/JeonHyowon-assignment/JeonHyowon-assignment/Base.lproj/LaunchScreen.storyboard b/JeonHyowon-assignment/JeonHyowon-assignment/Resource/Base.lproj/LaunchScreen.storyboard similarity index 100% rename from JeonHyowon-assignment/JeonHyowon-assignment/Base.lproj/LaunchScreen.storyboard rename to JeonHyowon-assignment/JeonHyowon-assignment/Resource/Base.lproj/LaunchScreen.storyboard diff --git a/JeonHyowon-assignment/JeonHyowon-assignment/Fonts/SF-Pro-Display-Bold.otf b/JeonHyowon-assignment/JeonHyowon-assignment/Resource/Fonts/SF-Pro-Display-Bold.otf similarity index 100% rename from JeonHyowon-assignment/JeonHyowon-assignment/Fonts/SF-Pro-Display-Bold.otf rename to JeonHyowon-assignment/JeonHyowon-assignment/Resource/Fonts/SF-Pro-Display-Bold.otf diff --git a/JeonHyowon-assignment/JeonHyowon-assignment/Fonts/SF-Pro-Display-Light.otf b/JeonHyowon-assignment/JeonHyowon-assignment/Resource/Fonts/SF-Pro-Display-Light.otf similarity index 100% rename from JeonHyowon-assignment/JeonHyowon-assignment/Fonts/SF-Pro-Display-Light.otf rename to JeonHyowon-assignment/JeonHyowon-assignment/Resource/Fonts/SF-Pro-Display-Light.otf diff --git a/JeonHyowon-assignment/JeonHyowon-assignment/Fonts/SF-Pro-Display-Medium.otf b/JeonHyowon-assignment/JeonHyowon-assignment/Resource/Fonts/SF-Pro-Display-Medium.otf similarity index 100% rename from JeonHyowon-assignment/JeonHyowon-assignment/Fonts/SF-Pro-Display-Medium.otf rename to JeonHyowon-assignment/JeonHyowon-assignment/Resource/Fonts/SF-Pro-Display-Medium.otf diff --git a/JeonHyowon-assignment/JeonHyowon-assignment/Fonts/SF-Pro-Display-Regular.otf b/JeonHyowon-assignment/JeonHyowon-assignment/Resource/Fonts/SF-Pro-Display-Regular.otf similarity index 100% rename from JeonHyowon-assignment/JeonHyowon-assignment/Fonts/SF-Pro-Display-Regular.otf rename to JeonHyowon-assignment/JeonHyowon-assignment/Resource/Fonts/SF-Pro-Display-Regular.otf diff --git a/JeonHyowon-assignment/JeonHyowon-assignment/Fonts/SF-Pro-Display-Thin.otf b/JeonHyowon-assignment/JeonHyowon-assignment/Resource/Fonts/SF-Pro-Display-Thin.otf similarity index 100% rename from JeonHyowon-assignment/JeonHyowon-assignment/Fonts/SF-Pro-Display-Thin.otf rename to JeonHyowon-assignment/JeonHyowon-assignment/Resource/Fonts/SF-Pro-Display-Thin.otf diff --git a/JeonHyowon-assignment/JeonHyowon-assignment/TodayWeatherData.swift b/JeonHyowon-assignment/JeonHyowon-assignment/Source/Data/TodayWeatherData.swift similarity index 100% rename from JeonHyowon-assignment/JeonHyowon-assignment/TodayWeatherData.swift rename to JeonHyowon-assignment/JeonHyowon-assignment/Source/Data/TodayWeatherData.swift diff --git a/JeonHyowon-assignment/JeonHyowon-assignment/WeatherData.swift b/JeonHyowon-assignment/JeonHyowon-assignment/Source/Data/WeatherData.swift similarity index 100% rename from JeonHyowon-assignment/JeonHyowon-assignment/WeatherData.swift rename to JeonHyowon-assignment/JeonHyowon-assignment/Source/Data/WeatherData.swift diff --git a/JeonHyowon-assignment/JeonHyowon-assignment/WeeklyWeatherData.swift b/JeonHyowon-assignment/JeonHyowon-assignment/Source/Data/WeeklyWeatherData.swift similarity index 100% rename from JeonHyowon-assignment/JeonHyowon-assignment/WeeklyWeatherData.swift rename to JeonHyowon-assignment/JeonHyowon-assignment/Source/Data/WeeklyWeatherData.swift diff --git a/JeonHyowon-assignment/JeonHyowon-assignment/GetWeatherService.swift b/JeonHyowon-assignment/JeonHyowon-assignment/Source/Network/GetWeatherService.swift similarity index 100% rename from JeonHyowon-assignment/JeonHyowon-assignment/GetWeatherService.swift rename to JeonHyowon-assignment/JeonHyowon-assignment/Source/Network/GetWeatherService.swift diff --git a/JeonHyowon-assignment/JeonHyowon-assignment/NetworkError.swift b/JeonHyowon-assignment/JeonHyowon-assignment/Source/Network/NetworkError.swift similarity index 100% rename from JeonHyowon-assignment/JeonHyowon-assignment/NetworkError.swift rename to JeonHyowon-assignment/JeonHyowon-assignment/Source/Network/NetworkError.swift diff --git a/JeonHyowon-assignment/JeonHyowon-assignment/LocationTableViewCell.swift b/JeonHyowon-assignment/JeonHyowon-assignment/Source/Presentation/Main/Cell/LocationTableViewCell.swift similarity index 100% rename from JeonHyowon-assignment/JeonHyowon-assignment/LocationTableViewCell.swift rename to JeonHyowon-assignment/JeonHyowon-assignment/Source/Presentation/Main/Cell/LocationTableViewCell.swift diff --git a/JeonHyowon-assignment/JeonHyowon-assignment/Source/Presentation/Main/View/MainView.swift b/JeonHyowon-assignment/JeonHyowon-assignment/Source/Presentation/Main/View/MainView.swift new file mode 100644 index 0000000..46308f2 --- /dev/null +++ b/JeonHyowon-assignment/JeonHyowon-assignment/Source/Presentation/Main/View/MainView.swift @@ -0,0 +1,88 @@ +// +// MainView.swift +// JeonHyowon-assignment +// +// Created by Hyowon Jeon on 12/14/23. +// + +import UIKit + +import SnapKit +import Then + +final class MainView: UIView { + + public let cityList: [String] = ["seoul", "jeju", "gwangju", "daegu", "cheonan"] + + public var settingButton = UIButton().then { + $0.setImage(UIImage(named: "icon_setting"), for: .normal) + } + + public var weatherLabel = UILabel().then { + $0.text = "날씨" + $0.font = UIFont(name: "SFProDisplay-Bold", size: 36) + $0.textColor = .white + } + + public var searchBar = UISearchBar().then { + $0.placeholder = "도시 또는 공항 검색" + $0.clipsToBounds = true + $0.layer.cornerRadius = 10 + $0.setImage(UIImage(named: "icon_search"), for: .search, state: .normal) + $0.searchBarStyle = .minimal + } + + public var tableView = UITableView(frame: .zero, style: .plain).then { + $0.backgroundColor = .clear + $0.clipsToBounds = true + $0.sectionHeaderTopPadding = 0 + } + + override init(frame: CGRect) { + super.init(frame: frame) + + setupHierarchy() + setupLayout() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + private func setupHierarchy() { + [ + settingButton, + weatherLabel, + searchBar, + tableView + ].forEach { + self.addSubview($0) + } + } + + private func setupLayout() { + settingButton.snp.makeConstraints { + $0.top.equalTo(self.safeAreaLayoutGuide).offset(8) + $0.trailing.equalToSuperview().inset(10) + $0.size.equalTo(44) + } + + weatherLabel.snp.makeConstraints { + $0.top.equalTo(self.safeAreaLayoutGuide).offset(53) + $0.leading.equalToSuperview().inset(20) + } + + searchBar.snp.makeConstraints { + $0.top.equalTo(weatherLabel.snp.bottom).offset(8) + $0.leading.trailing.equalToSuperview().inset(20) + $0.height.equalTo(40) + } + + tableView.snp.makeConstraints { + $0.top.equalTo(searchBar.snp.bottom).offset(15) + $0.leading.trailing.equalToSuperview().inset(16) + $0.bottom.equalToSuperview() + } + } +} + diff --git a/JeonHyowon-assignment/JeonHyowon-assignment/Source/Presentation/Main/ViewController/MainViewController.swift b/JeonHyowon-assignment/JeonHyowon-assignment/Source/Presentation/Main/ViewController/MainViewController.swift new file mode 100644 index 0000000..30c17a1 --- /dev/null +++ b/JeonHyowon-assignment/JeonHyowon-assignment/Source/Presentation/Main/ViewController/MainViewController.swift @@ -0,0 +1,81 @@ +// +// MainViewController.swift +// JeonHyowon-assignment +// +// Created by Hyowon Jeon on 10/25/23. +// + +import UIKit + +import SnapKit +import Then + +final class MainViewController: UIViewController { + + private let rootView = MainView() + + override func loadView() { + self.view = rootView + } + + override func viewDidLoad() { + super.viewDidLoad() + + register() + delegate() + setupStyle() + + } + + override func touchesBegan(_ touches: Set, with event: UIEvent?) { + self.view.endEditing(true) + } + + private func register() { + rootView.tableView.register(LocationTableViewCell.self, forCellReuseIdentifier: LocationTableViewCell.identifier) + } + + private func delegate() { + rootView.tableView.dataSource = self + rootView.tableView.delegate = self + } + + private func setupStyle() { + view.backgroundColor = .black + self.navigationController?.navigationBar.isHidden = true + } +} + +extension MainViewController: UITableViewDelegate { + func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { + self.navigationController?.pushViewController(WeatherDetailViewController(), animated: true) + } + + func tableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> UIView? { + return UIView() + } + + func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat { + return 16 + } +} + +extension MainViewController: UITableViewDataSource { + func numberOfSections(in tableView: UITableView) -> Int { + return rootView.cityList.count + } + func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + return 1 + } + + func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + guard let cell = tableView.dequeueReusableCell( + withIdentifier: LocationTableViewCell.identifier, + for: indexPath + ) as? LocationTableViewCell else {return UITableViewCell()} + + cell.selectionStyle = .none + cell.bindData(city: rootView.cityList[indexPath.section]) + return cell + } +} diff --git a/JeonHyowon-assignment/JeonHyowon-assignment/TodayWeatherCollectionViewCell.swift b/JeonHyowon-assignment/JeonHyowon-assignment/Source/Presentation/WeatherDetail/Cell/TodayWeatherCollectionViewCell.swift similarity index 100% rename from JeonHyowon-assignment/JeonHyowon-assignment/TodayWeatherCollectionViewCell.swift rename to JeonHyowon-assignment/JeonHyowon-assignment/Source/Presentation/WeatherDetail/Cell/TodayWeatherCollectionViewCell.swift diff --git a/JeonHyowon-assignment/JeonHyowon-assignment/WeeklyWeatherTableViewCell.swift b/JeonHyowon-assignment/JeonHyowon-assignment/Source/Presentation/WeatherDetail/Cell/WeeklyWeatherTableViewCell.swift similarity index 100% rename from JeonHyowon-assignment/JeonHyowon-assignment/WeeklyWeatherTableViewCell.swift rename to JeonHyowon-assignment/JeonHyowon-assignment/Source/Presentation/WeatherDetail/Cell/WeeklyWeatherTableViewCell.swift diff --git a/JeonHyowon-assignment/JeonHyowon-assignment/WeatherDetailViewController.swift b/JeonHyowon-assignment/JeonHyowon-assignment/Source/Presentation/WeatherDetail/View/WeatherDetailView.swift similarity index 68% rename from JeonHyowon-assignment/JeonHyowon-assignment/WeatherDetailViewController.swift rename to JeonHyowon-assignment/JeonHyowon-assignment/Source/Presentation/WeatherDetail/View/WeatherDetailView.swift index 59387e1..e217b7f 100644 --- a/JeonHyowon-assignment/JeonHyowon-assignment/WeatherDetailViewController.swift +++ b/JeonHyowon-assignment/JeonHyowon-assignment/Source/Presentation/WeatherDetail/View/WeatherDetailView.swift @@ -1,8 +1,8 @@ // -// WeatherDetailViewController.swift +// WeatherDetailView.swift // JeonHyowon-assignment // -// Created by Hyowon Jeon on 10/25/23. +// Created by Hyowon Jeon on 12/14/23. // import UIKit @@ -10,9 +10,9 @@ import UIKit import SnapKit import Then -class WeatherDetailViewController: UIViewController { +final class WeatherDetailView: UIView { - let todayWeatherData: [TodayWeatherData] = [.init(hour: "Now", image: "icon_cloudy", temperature: "18°"), + public let todayWeatherData: [TodayWeatherData] = [.init(hour: "Now", image: "icon_cloudy", temperature: "18°"), .init(hour: "10시", image: "icon_heavyrain", temperature: "17°"), .init(hour: "11시", image: "icon_lightning", temperature: "16°"), .init(hour: "12시", image: "icon_cloudy", temperature: "16°"), @@ -40,74 +40,72 @@ class WeatherDetailViewController: UIViewController { .init(day: "화", weatherImage: "cloud.sleet.fill", minimumTemperature: "18°", temperatureImage: "temperature10", maximumTemperature: "25°"), .init(day: "수", weatherImage: "sun.max.fill", minimumTemperature: "18°", temperatureImage: "temperature11", maximumTemperature: "25°")] - private var backgroundImageView = UIImageView().then { + public var backgroundImageView = UIImageView().then { $0.image = UIImage(named: "Img") $0.contentMode = .scaleAspectFill } - private var scrollView = UIScrollView().then { + public var scrollView = UIScrollView().then { $0.showsHorizontalScrollIndicator = false } - private var contentView = UIView() + public var contentView = UIView() - private var cityLabel = UILabel().then { + public var cityLabel = UILabel().then { $0.text = "서울특별시" $0.font = UIFont(name: "SFProDisplay-Regular", size: 36) $0.textColor = .white } - private var currentTemperatureLabel = UILabel().then { + public var currentTemperatureLabel = UILabel().then { $0.text = "21°" $0.font = UIFont(name: "SFProDisplay-Thin", size: 102) $0.textColor = .white } - private var currentWeatherLabel = UILabel().then { + public var currentWeatherLabel = UILabel().then { $0.text = "흐림" $0.font = UIFont(name: "SFProDisplay-Regular", size: 24) $0.textColor = .white } - private var temperatureLabel = UILabel().then { + public var temperatureLabel = UILabel().then { $0.text = "최고:29° 최저:15°" $0.font = UIFont(name: "SFProDisplay-Medium", size: 20) $0.textColor = .white } - private var weatherDetailView = UIView().then { + public var weatherDetailView = UIView().then { $0.clipsToBounds = true $0.layer.cornerRadius = 15 $0.layer.borderWidth = 0.5 $0.layer.borderColor = UIColor(red: 1, green: 1, blue: 1, alpha: 0.25).cgColor } - private var detailLabel = UILabel().then { + public var detailLabel = UILabel().then { $0.text = "08:00~09:00에 강우 상태가, 18:00에 한때 흐린 상태가 예상됩니다." $0.font = UIFont(name: "SFProDisplay-Regular", size: 18) $0.textColor = .white $0.numberOfLines = 0 } - private var separatorView = UIView().then { + public var separatorView = UIView().then { $0.backgroundColor = UIColor(red: 1, green: 1, blue: 1, alpha: 0.25) } - private var collectionViewLayout = UICollectionViewFlowLayout().then { + public var collectionViewLayout = UICollectionViewFlowLayout().then { $0.itemSize = CGSize(width: 44, height: 140) $0.minimumInteritemSpacing = 22 $0.scrollDirection = .horizontal $0.sectionInset = UIEdgeInsets(top: 0, left: 15, bottom: 0, right: 15) } - private lazy var collectionView = UICollectionView(frame: .zero, collectionViewLayout: collectionViewLayout).then { + public lazy var collectionView = UICollectionView(frame: .zero, collectionViewLayout: collectionViewLayout).then { $0.backgroundColor = .clear $0.collectionViewLayout = collectionViewLayout - $0.dataSource = self - $0.register(TodayWeatherCollectionViewCell.self, forCellWithReuseIdentifier: TodayWeatherCollectionViewCell.identifier) } - private lazy var tableView = UITableView(frame: .zero, style: .plain).then { + public var tableView = UITableView(frame: .zero, style: .plain).then { $0.backgroundColor = .init(white: 0.5, alpha: 0.05) $0.separatorColor = .lightGray $0.separatorStyle = .singleLine @@ -117,114 +115,80 @@ class WeatherDetailViewController: UIViewController { $0.layer.borderColor = UIColor(red: 1, green: 1, blue: 1, alpha: 0.25).cgColor $0.clipsToBounds = true $0.sectionHeaderTopPadding = 0 - $0.delegate = self - $0.dataSource = self - $0.register(WeeklyWeatherTableViewCell.self, forCellReuseIdentifier: WeeklyWeatherTableViewCell.identifier) } - private var mapButton = UIButton().then { + public var mapButton = UIButton().then { $0.setImage(UIImage(named: "icon_map"), for: .normal) } - private var toolbarView = UIView().then { + public var toolbarView = UIView().then { $0.layer.borderWidth = 0.5 $0.layer.borderColor = UIColor(red: 1, green: 1, blue: 1, alpha: 0.25).cgColor } - private lazy var menuButton = UIButton().then { + public var menuButton = UIButton().then { $0.setImage(UIImage(named: "icon_menu"), for: .normal) - $0.addTarget(self, action: #selector(didTapMenuButton), for: .touchUpInside) } - @objc func didTapMenuButton() { - self.navigationController?.popViewController(animated: true) - } + override init(frame: CGRect) { + super.init(frame: frame) - override func viewDidLoad() { - super.viewDidLoad() - self.view.backgroundColor = .black - - setLayout() + setupStyle() + setupHierarchy() + setupLayout() } -} - -extension WeatherDetailViewController: UICollectionViewDataSource { - func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { - return todayWeatherData.count + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") } - func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { - guard let item = collectionView.dequeueReusableCell( - withReuseIdentifier: TodayWeatherCollectionViewCell.identifier, - for: indexPath - ) as? TodayWeatherCollectionViewCell else {return UICollectionViewCell()} - - item.bindData(data: todayWeatherData[indexPath.item]) - return item + private func setupStyle() { + self.backgroundColor = .black } -} - -extension WeatherDetailViewController: UITableViewDelegate { - func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { - let headerView = UIView() - - let imageView = UIImageView().then { - $0.image = UIImage(named: "icon_calendar") - $0.tintColor = .lightGray - $0.contentMode = .scaleAspectFill - } - - let label = UILabel().then { - $0.text = "10일간의 일기예보" - $0.font = UIFont(name: "SFProDisplay-Medium", size: 15) - $0.textColor = .lightGray + + private func setupHierarchy() { + [ + backgroundImageView, + scrollView, + toolbarView + ].forEach { + self.addSubview($0) } - [imageView, label].forEach { - headerView.addSubview($0) + [ + contentView + ].forEach { + scrollView.addSubview($0) } - imageView.snp.makeConstraints { - $0.top.bottom.equalToSuperview().inset(12) - $0.leading.equalToSuperview().inset(16) + [ + mapButton, + menuButton + ].forEach { + toolbarView.addSubview($0) } - label.snp.makeConstraints { - $0.centerY.equalToSuperview() - $0.leading.equalTo(imageView.snp.trailing).offset(5) + [ + cityLabel, + currentTemperatureLabel, + currentWeatherLabel, + temperatureLabel, + weatherDetailView, + tableView + ].forEach { + contentView.addSubview($0) } - return headerView - } -} - -extension WeatherDetailViewController: UITableViewDataSource { - func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { - return weeklyWeatherData.count - } - - func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { - guard let cell = tableView.dequeueReusableCell( - withIdentifier: WeeklyWeatherTableViewCell.identifier, - for: indexPath - ) as? WeeklyWeatherTableViewCell else {return UITableViewCell()} - - cell.selectionStyle = .none - cell.bindData(data: weeklyWeatherData[indexPath.row]) - return cell - } -} - -private extension WeatherDetailViewController { - func setLayout() { [ - backgroundImageView, - scrollView, - toolbarView + detailLabel, + separatorView, + collectionView ].forEach { - view.addSubview($0) + weatherDetailView.addSubview($0) } - + } + + private func setupLayout() { backgroundImageView.snp.makeConstraints { $0.edges.equalToSuperview() } @@ -239,23 +203,10 @@ private extension WeatherDetailViewController { $0.height.equalTo(82) } - [ - contentView - ].forEach { - scrollView.addSubview($0) - } - contentView.snp.makeConstraints { $0.edges.width.equalToSuperview() } - [ - mapButton, - menuButton - ].forEach { - toolbarView.addSubview($0) - } - mapButton.snp.makeConstraints { $0.top.equalToSuperview().inset(4) $0.leading.equalToSuperview().inset(10) @@ -266,17 +217,6 @@ private extension WeatherDetailViewController { $0.trailing.equalToSuperview().inset(10) } - [ - cityLabel, - currentTemperatureLabel, - currentWeatherLabel, - temperatureLabel, - weatherDetailView, - tableView - ].forEach { - contentView.addSubview($0) - } - cityLabel.snp.makeConstraints { $0.top.equalToSuperview().inset(34) $0.centerX.equalToSuperview() @@ -308,14 +248,6 @@ private extension WeatherDetailViewController { $0.height.equalTo(weeklyWeatherData.count * 54 + 80) } - [ - detailLabel, - separatorView, - collectionView - ].forEach { - weatherDetailView.addSubview($0) - } - detailLabel.snp.makeConstraints { $0.top.equalToSuperview().inset(10) $0.leading.trailing.equalToSuperview().inset(16) diff --git a/JeonHyowon-assignment/JeonHyowon-assignment/Source/Presentation/WeatherDetail/ViewController/WeatherDetailViewController.swift b/JeonHyowon-assignment/JeonHyowon-assignment/Source/Presentation/WeatherDetail/ViewController/WeatherDetailViewController.swift new file mode 100644 index 0000000..667e04a --- /dev/null +++ b/JeonHyowon-assignment/JeonHyowon-assignment/Source/Presentation/WeatherDetail/ViewController/WeatherDetailViewController.swift @@ -0,0 +1,121 @@ +// +// WeatherDetailViewController.swift +// JeonHyowon-assignment +// +// Created by Hyowon Jeon on 10/25/23. +// + +import UIKit + +import SnapKit +import Then + +final class WeatherDetailViewController: UIViewController { + + private let rootView = WeatherDetailView() + + override func loadView() { + self.view = rootView + } + + override func viewDidLoad() { + super.viewDidLoad() + + target() + register() + delegate() + setupStyle() + + } + + private func target() { + rootView.menuButton.addTarget(self, + action: #selector(didTapMenuButton), for: .touchUpInside) + } + + private func register() { + rootView.collectionView.register(TodayWeatherCollectionViewCell.self, forCellWithReuseIdentifier: TodayWeatherCollectionViewCell.identifier) + rootView.tableView.register(WeeklyWeatherTableViewCell.self, forCellReuseIdentifier: WeeklyWeatherTableViewCell.identifier) + } + + private func delegate() { + rootView.tableView.delegate = self + rootView.tableView.dataSource = self + rootView.collectionView.dataSource = self + } + + private func setupStyle() { + self.view.backgroundColor = .black + } + + @objc func didTapMenuButton() { + self.navigationController?.popViewController(animated: true) + } +} + +extension WeatherDetailViewController: UICollectionViewDataSource { + func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { + return rootView.todayWeatherData.count + } + + func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { + guard let item = collectionView.dequeueReusableCell( + withReuseIdentifier: TodayWeatherCollectionViewCell.identifier, + for: indexPath + ) as? TodayWeatherCollectionViewCell else {return UICollectionViewCell()} + + item.bindData(data: rootView.todayWeatherData[indexPath.item]) + return item + } +} + +extension WeatherDetailViewController: UITableViewDelegate { + func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { + let headerView = UIView() + + let imageView = UIImageView().then { + $0.image = UIImage(named: "icon_calendar") + $0.tintColor = .lightGray + $0.contentMode = .scaleAspectFill + } + + let label = UILabel().then { + $0.text = "10일간의 일기예보" + $0.font = UIFont(name: "SFProDisplay-Medium", size: 15) + $0.textColor = .lightGray + } + + [imageView, label].forEach { + headerView.addSubview($0) + } + + imageView.snp.makeConstraints { + $0.top.bottom.equalToSuperview().inset(12) + $0.leading.equalToSuperview().inset(16) + } + + label.snp.makeConstraints { + $0.centerY.equalToSuperview() + $0.leading.equalTo(imageView.snp.trailing).offset(5) + } + + return headerView + } +} + +extension WeatherDetailViewController: UITableViewDataSource { + func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + return rootView.weeklyWeatherData.count + } + + func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + guard let cell = tableView.dequeueReusableCell( + withIdentifier: WeeklyWeatherTableViewCell.identifier, + for: indexPath + ) as? WeeklyWeatherTableViewCell else {return UITableViewCell()} + + cell.selectionStyle = .none + cell.bindData(data: rootView.weeklyWeatherData[indexPath.row]) + return cell + } +}