diff --git a/Weather-App/Weather-App/AppDelegate.swift b/Weather-App/Weather-App/AppDelegate.swift index 1c0f960..e518dac 100644 --- a/Weather-App/Weather-App/AppDelegate.swift +++ b/Weather-App/Weather-App/AppDelegate.swift @@ -13,7 +13,18 @@ class AppDelegate: UIResponder, UIApplicationDelegate { func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { - // Override point for customization after application launch. + + /* ========= 폰트 이름 확인 ========= + for family in UIFont.familyNames { + // 폰트 패밀리 이름 + print(family) + // 각 폰트 이름 + for names in UIFont.fontNames(forFamilyName: family) { + print("== \(names)") + } + } + =============================== */ + return true } diff --git a/Weather-App/Weather-App/Assets.xcassets/icons/icon-search.imageset/Contents.json b/Weather-App/Weather-App/Assets.xcassets/icons/icon-search.imageset/Contents.json index 00d2a45..1fb746a 100644 --- a/Weather-App/Weather-App/Assets.xcassets/icons/icon-search.imageset/Contents.json +++ b/Weather-App/Weather-App/Assets.xcassets/icons/icon-search.imageset/Contents.json @@ -1,7 +1,7 @@ { "images" : [ { - "filename" : "Frame 8.svg", + "filename" : "search.svg", "idiom" : "universal", "scale" : "1x" }, diff --git a/Weather-App/Weather-App/Assets.xcassets/icons/icon-search.imageset/Frame 8.svg b/Weather-App/Weather-App/Assets.xcassets/icons/icon-search.imageset/Frame 8.svg deleted file mode 100644 index b100ed1..0000000 --- a/Weather-App/Weather-App/Assets.xcassets/icons/icon-search.imageset/Frame 8.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/Weather-App/Weather-App/Assets.xcassets/icons/icon-search.imageset/search.svg b/Weather-App/Weather-App/Assets.xcassets/icons/icon-search.imageset/search.svg new file mode 100644 index 0000000..b66dd1f --- /dev/null +++ b/Weather-App/Weather-App/Assets.xcassets/icons/icon-search.imageset/search.svg @@ -0,0 +1,3 @@ + + + diff --git a/Weather-App/Weather-App/DetailViewController.swift b/Weather-App/Weather-App/DetailViewController.swift new file mode 100644 index 0000000..bf8f483 --- /dev/null +++ b/Weather-App/Weather-App/DetailViewController.swift @@ -0,0 +1,1017 @@ +// +// DetailViewController.swift +// Weather-App +// +// Created by yeonsu on 10/21/23. +// + +import UIKit +import SwiftUI + +class DetailViewController: UIViewController { + + let scrollView = UIScrollView() + var contentView = UIView() + + let horizontalScrollView: UIScrollView = { + let scrollView = UIScrollView() + scrollView.showsHorizontalScrollIndicator = false + return scrollView + }() + + let horizontalContentView: UIView = { + let content = UIView() + + return content + }() + + let locationText: UILabel = { + let title = UILabel() + let customFont = UIFont(name: "SFProText-Medium", size: 36.0) + title.font = customFont + title.text = "의정부시" + title.textColor = .white + + return title + }() + + let degreeNumber: UILabel = { + let degreeNumber = UILabel() + let customDegreeFont = UIFont(name: "SFProText-Thin", size: 102.0) + degreeNumber.font = customDegreeFont + degreeNumber.text = "21°" + degreeNumber.textColor = .white + + return degreeNumber + }() + + let statusText: UILabel = { + let statusText = UILabel() + let customStatusFont = UIFont(name: "SFProText-Regular", size: 24.0) + statusText.font = customStatusFont + statusText.text = "흐림" + statusText.textColor = .white + + return statusText + }() + + let todayDegreeNumber: UILabel = { + let todayDegreeNumber = UILabel() + let customStatusFont = UIFont(name: "SFProText-Medium", size: 20.0) + todayDegreeNumber.font = customStatusFont + todayDegreeNumber.text = "최고:29° 최저:15°" + todayDegreeNumber.textColor = .white + + return todayDegreeNumber + }() + + let forecastText: UILabel = { + let forecastText = UILabel() + let customStatusFont = UIFont(name: "SFProText-Medium", size: 18.0) + forecastText.font = customStatusFont + forecastText.textColor = .white + forecastText.text = "08:00~09:00에 강우 상태가, 18:00에 한 때 흐린 상태가 예상됩니다." + forecastText.numberOfLines = 0 + + return forecastText + }() + + let lineView: UIView = { + let lineView = UIView() + lineView.backgroundColor = .white + + return lineView + }() + + let bottomLineView: UIView = { + let lineView = UIView() + lineView.backgroundColor = UIColor(red: 1, green: 1, blue: 1, alpha: 0.05) + + return lineView + }() + + let bottomView: UIView = { + let uiView = UIView() + uiView.backgroundColor = .brown + return uiView + }() + + let mapiconView: UIButton = { + let view = UIButton() + let imageView = UIImage(named: "icon-map") + + view.setImage(imageView, for: .normal) + + return view + }() + + let listIconView: UIButton = { + let view = UIButton() + let imageView = UIImage(named: "icon-list") + + view.setImage(imageView, for: .normal) + return view + }() + + + let weatherContentView: UIView = { + let contentView = UIView() + contentView.backgroundColor = UIColor(red: 1, green: 1, blue: 1, alpha: 0.01) + contentView.layer.cornerRadius = 8 + contentView.layer.borderColor = UIColor(red: 1, green: 1, blue: 1, alpha: 0.05).cgColor + contentView.layer.borderWidth = 1 + + return contentView + }() + + + let verticalStackView: UIStackView = { + let stackView = UIStackView() + stackView.axis = .vertical + stackView.distribution = .fillEqually + return stackView + }() + + let horizontalStackView: UIStackView = { + let stackView = UIStackView() + stackView.axis = .horizontal + stackView.distribution = .fillEqually + return stackView + }() + + let directionIconView: UIView = { + let view = UIView() + let imageView = UIImageView() + imageView.image = UIImage(named: "icon-direction") + imageView.contentMode = .scaleAspectFill + + view.addSubview(imageView) + + imageView.translatesAutoresizingMaskIntoConstraints = false + NSLayoutConstraint.activate([ + + imageView.leadingAnchor.constraint(equalTo: view.leadingAnchor), + imageView.trailingAnchor.constraint(equalTo: view.trailingAnchor), + imageView.topAnchor.constraint(equalTo: view.topAnchor), + imageView.bottomAnchor.constraint(equalTo: view.bottomAnchor) + ]) + return view + }() + + let pageIconView: UIView = { + let view = UIView() + let imageView = UIImageView() + imageView.image = UIImage(named: "icon-page") + imageView.contentMode = .scaleAspectFill + + view.addSubview(imageView) + + imageView.translatesAutoresizingMaskIntoConstraints = false + NSLayoutConstraint.activate([ + + imageView.leadingAnchor.constraint(equalTo: view.leadingAnchor), + imageView.trailingAnchor.constraint(equalTo: view.trailingAnchor), + imageView.topAnchor.constraint(equalTo: view.topAnchor), + imageView.bottomAnchor.constraint(equalTo: view.bottomAnchor) + ]) + return view + }() + + + let timeLabel: UILabel = { + let text = UILabel() + let customDegreeFont = UIFont(name: "SFProText-Medium", size: 17.0) + text.font = customDegreeFont + text.text = "Now" + text.textAlignment = .center + text.textColor = .white + return text + }() + + let iconView: UIView = { + let view = UIView() + let imageView = UIImageView() + imageView.image = UIImage(named: "status-blur") + imageView.contentMode = .scaleAspectFill + + view.addSubview(imageView) + + imageView.translatesAutoresizingMaskIntoConstraints = false + NSLayoutConstraint.activate([ + + imageView.leadingAnchor.constraint(equalTo: view.leadingAnchor), + imageView.trailingAnchor.constraint(equalTo: view.trailingAnchor), + imageView.topAnchor.constraint(equalTo: view.topAnchor), + imageView.bottomAnchor.constraint(equalTo: view.bottomAnchor) + ]) + return view + }() + + let degreeForDayText: UILabel = { + let degreeNumber = UILabel() + let customDegreeFont = UIFont(name: "SFProText-Medium", size: 22.0) + degreeNumber.font = customDegreeFont + degreeNumber.text = "21°" + degreeNumber.textColor = .white + degreeNumber.textAlignment = .center + + return degreeNumber + }() + + let verticalStackView2: UIStackView = { + let stackView = UIStackView() + stackView.axis = .vertical + stackView.distribution = .fillEqually + return stackView + }() + + + let timeLabel2: UILabel = { + let text = UILabel() + let customDegreeFont = UIFont(name: "SFProText-Medium", size: 17.0) + text.font = customDegreeFont + text.text = "10시" + text.textAlignment = .center + text.textColor = .white + return text + }() + + let iconView2: UIView = { + let view = UIView() + let imageView = UIImageView() + imageView.image = UIImage(named: "status-drizzle") + imageView.contentMode = .scaleAspectFill + + view.addSubview(imageView) + + imageView.translatesAutoresizingMaskIntoConstraints = false + NSLayoutConstraint.activate([ + + imageView.leadingAnchor.constraint(equalTo: view.leadingAnchor), + imageView.trailingAnchor.constraint(equalTo: view.trailingAnchor), + imageView.topAnchor.constraint(equalTo: view.topAnchor), + imageView.bottomAnchor.constraint(equalTo: view.bottomAnchor) + ]) + return view + }() + + let degreeForDayText2: UILabel = { + let degreeNumber = UILabel() + let customDegreeFont = UIFont(name: "SFProText-Medium", size: 22.0) + degreeNumber.font = customDegreeFont + degreeNumber.text = "21°" + degreeNumber.textColor = .white + degreeNumber.textAlignment = .center + + return degreeNumber + }() + + let verticalStackView3: UIStackView = { + let stackView = UIStackView() + stackView.axis = .vertical + stackView.distribution = .fillEqually + return stackView + }() + + + let timeLabel3: UILabel = { + let text = UILabel() + let customDegreeFont = UIFont(name: "SFProText-Medium", size: 19.0) + text.font = customDegreeFont + text.text = "11시" + text.textAlignment = .center + text.textColor = .white + return text + }() + + let iconView3: UIView = { + let view = UIView() + let imageView = UIImageView() + imageView.image = UIImage(named: "status-rain") + imageView.contentMode = .scaleAspectFill + + view.addSubview(imageView) + + imageView.translatesAutoresizingMaskIntoConstraints = false + NSLayoutConstraint.activate([ + + imageView.leadingAnchor.constraint(equalTo: view.leadingAnchor), + imageView.trailingAnchor.constraint(equalTo: view.trailingAnchor), + imageView.topAnchor.constraint(equalTo: view.topAnchor), + imageView.bottomAnchor.constraint(equalTo: view.bottomAnchor) + ]) + return view + }() + + let degreeForDayText3: UILabel = { + let degreeNumber = UILabel() + let customDegreeFont = UIFont(name: "SFProText-Medium", size: 22.0) + degreeNumber.font = customDegreeFont + degreeNumber.text = "19°" + degreeNumber.textColor = .white + degreeNumber.textAlignment = .center + + return degreeNumber + }() + + let verticalStackView4: UIStackView = { + let stackView = UIStackView() + stackView.axis = .vertical + stackView.distribution = .fillEqually + return stackView + }() + + + let timeLabel4: UILabel = { + let text = UILabel() + let customDegreeFont = UIFont(name: "SFProText-Medium", size: 17.0) + text.font = customDegreeFont + text.text = "12시" + text.textAlignment = .center + text.textColor = .white + return text + }() + + let iconView4: UIView = { + let view = UIView() + let imageView = UIImageView() + imageView.image = UIImage(named: "status-thunder") + imageView.contentMode = .scaleAspectFill + + view.addSubview(imageView) + + imageView.translatesAutoresizingMaskIntoConstraints = false + NSLayoutConstraint.activate([ + + imageView.leadingAnchor.constraint(equalTo: view.leadingAnchor), + imageView.trailingAnchor.constraint(equalTo: view.trailingAnchor), + imageView.topAnchor.constraint(equalTo: view.topAnchor), + imageView.bottomAnchor.constraint(equalTo: view.bottomAnchor) + ]) + return view + }() + + let degreeForDayText4: UILabel = { + let degreeNumber = UILabel() + let customDegreeFont = UIFont(name: "SFProText-Medium", size: 22.0) + degreeNumber.font = customDegreeFont + degreeNumber.text = "19°" + degreeNumber.textColor = .white + degreeNumber.textAlignment = .center + + return degreeNumber + }() + + let verticalStackView5: UIStackView = { + let stackView = UIStackView() + stackView.axis = .vertical + stackView.distribution = .fillEqually + return stackView + }() + + + let timeLabel5: UILabel = { + let text = UILabel() + let customDegreeFont = UIFont(name: "SFProText-Medium", size: 17.0) + text.font = customDegreeFont + text.text = "1시" + text.textAlignment = .center + text.textColor = .white + return text + }() + + let iconView5: UIView = { + let view = UIView() + let imageView = UIImageView() + imageView.image = UIImage(named: "status-shower") + imageView.contentMode = .scaleAspectFill + + view.addSubview(imageView) + + imageView.translatesAutoresizingMaskIntoConstraints = false + NSLayoutConstraint.activate([ + + imageView.leadingAnchor.constraint(equalTo: view.leadingAnchor), + imageView.trailingAnchor.constraint(equalTo: view.trailingAnchor), + imageView.topAnchor.constraint(equalTo: view.topAnchor), + imageView.bottomAnchor.constraint(equalTo: view.bottomAnchor) + ]) + return view + }() + + let degreeForDayText5: UILabel = { + let degreeNumber = UILabel() + let customDegreeFont = UIFont(name: "SFProText-Medium", size: 22.0) + degreeNumber.font = customDegreeFont + degreeNumber.text = "19°" + degreeNumber.textColor = .white + degreeNumber.textAlignment = .center + + return degreeNumber + }() + + let verticalStackView6: UIStackView = { + let stackView = UIStackView() + stackView.axis = .vertical + stackView.distribution = .fillEqually + return stackView + }() + + + let timeLabel6: UILabel = { + let text = UILabel() + let customDegreeFont = UIFont(name: "SFProText-Medium", size: 17.0) + text.font = customDegreeFont + text.text = "2시" + text.textAlignment = .center + text.textColor = .white + return text + }() + + let iconView6: UIView = { + let view = UIView() + let imageView = UIImageView() + imageView.image = UIImage(named: "status-drizzle") + imageView.contentMode = .scaleAspectFill + + view.addSubview(imageView) + + imageView.translatesAutoresizingMaskIntoConstraints = false + NSLayoutConstraint.activate([ + + imageView.leadingAnchor.constraint(equalTo: view.leadingAnchor), + imageView.trailingAnchor.constraint(equalTo: view.trailingAnchor), + imageView.topAnchor.constraint(equalTo: view.topAnchor), + imageView.bottomAnchor.constraint(equalTo: view.bottomAnchor) + ]) + return view + }() + + let degreeForDayText6: UILabel = { + let degreeNumber = UILabel() + let customDegreeFont = UIFont(name: "SFProText-Medium", size: 22.0) + degreeNumber.font = customDegreeFont + degreeNumber.text = "21°" + degreeNumber.textColor = .white + degreeNumber.textAlignment = .center + + return degreeNumber + }() + + let verticalStackView7: UIStackView = { + let stackView = UIStackView() + stackView.axis = .vertical + stackView.distribution = .fillEqually + return stackView + }() + + + let timeLabel7: UILabel = { + let text = UILabel() + let customDegreeFont = UIFont(name: "SFProText-Medium", size: 17.0) + text.font = customDegreeFont + text.text = "3시" + text.textAlignment = .center + text.textColor = .white + return text + }() + + let iconView7: UIView = { + let view = UIView() + let imageView = UIImageView() + imageView.image = UIImage(named: "status-rain") + imageView.contentMode = .scaleAspectFill + + view.addSubview(imageView) + + imageView.translatesAutoresizingMaskIntoConstraints = false + NSLayoutConstraint.activate([ + + imageView.leadingAnchor.constraint(equalTo: view.leadingAnchor), + imageView.trailingAnchor.constraint(equalTo: view.trailingAnchor), + imageView.topAnchor.constraint(equalTo: view.topAnchor), + imageView.bottomAnchor.constraint(equalTo: view.bottomAnchor) + ]) + return view + }() + + let degreeForDayText7: UILabel = { + let degreeNumber = UILabel() + let customDegreeFont = UIFont(name: "SFProText-Medium", size: 22.0) + degreeNumber.font = customDegreeFont + degreeNumber.text = "22°" + degreeNumber.textColor = .white + degreeNumber.textAlignment = .center + + return degreeNumber + }() + + let verticalStackView10: UIStackView = { + let stackView = UIStackView() + stackView.axis = .vertical + stackView.distribution = .fillEqually + return stackView + }() + + + let timeLabel10: UILabel = { + let text = UILabel() + let customDegreeFont = UIFont(name: "SFProText-Medium", size: 17.0) + text.font = customDegreeFont + text.text = "6시" + text.textAlignment = .center + text.textColor = .white + return text + }() + + let iconView10: UIView = { + let view = UIView() + let imageView = UIImageView() + imageView.image = UIImage(named: "status-blur") + imageView.contentMode = .scaleAspectFill + + view.addSubview(imageView) + + imageView.translatesAutoresizingMaskIntoConstraints = false + NSLayoutConstraint.activate([ + + imageView.leadingAnchor.constraint(equalTo: view.leadingAnchor), + imageView.trailingAnchor.constraint(equalTo: view.trailingAnchor), + imageView.topAnchor.constraint(equalTo: view.topAnchor), + imageView.bottomAnchor.constraint(equalTo: view.bottomAnchor) + ]) + return view + }() + + let degreeForDayText10: UILabel = { + let degreeNumber = UILabel() + let customDegreeFont = UIFont(name: "SFProText-Medium", size: 22.0) + degreeNumber.font = customDegreeFont + degreeNumber.text = "19°" + degreeNumber.textColor = .white + degreeNumber.textAlignment = .center + + return degreeNumber + }() + + let verticalStackView8: UIStackView = { + let stackView = UIStackView() + stackView.axis = .vertical + stackView.distribution = .fillEqually + return stackView + }() + + + let timeLabel8: UILabel = { + let text = UILabel() + let customDegreeFont = UIFont(name: "SFProText-Medium", size: 17.0) + text.font = customDegreeFont + text.text = "4시" + text.textAlignment = .center + text.textColor = .white + return text + }() + + let iconView8: UIView = { + let view = UIView() + let imageView = UIImageView() + imageView.image = UIImage(named: "status-drizzle") + imageView.contentMode = .scaleAspectFill + + view.addSubview(imageView) + + imageView.translatesAutoresizingMaskIntoConstraints = false + NSLayoutConstraint.activate([ + + imageView.leadingAnchor.constraint(equalTo: view.leadingAnchor), + imageView.trailingAnchor.constraint(equalTo: view.trailingAnchor), + imageView.topAnchor.constraint(equalTo: view.topAnchor), + imageView.bottomAnchor.constraint(equalTo: view.bottomAnchor) + ]) + return view + }() + + let degreeForDayText8: UILabel = { + let degreeNumber = UILabel() + let customDegreeFont = UIFont(name: "SFProText-Medium", size: 22.0) + degreeNumber.font = customDegreeFont + degreeNumber.text = "20°" + degreeNumber.textColor = .white + degreeNumber.textAlignment = .center + + return degreeNumber + }() + + let verticalStackView9: UIStackView = { + let stackView = UIStackView() + stackView.axis = .vertical + stackView.distribution = .fillEqually + return stackView + }() + + + let timeLabel9: UILabel = { + let text = UILabel() + let customDegreeFont = UIFont(name: "SFProText-Medium", size: 17.0) + text.font = customDegreeFont + text.text = "5시" + text.textAlignment = .center + text.textColor = .white + return text + }() + + let iconView9: UIView = { + let view = UIView() + let imageView = UIImageView() + imageView.image = UIImage(named: "status-drizzle") + imageView.contentMode = .scaleAspectFill + + view.addSubview(imageView) + + imageView.translatesAutoresizingMaskIntoConstraints = false + NSLayoutConstraint.activate([ + + imageView.leadingAnchor.constraint(equalTo: view.leadingAnchor), + imageView.trailingAnchor.constraint(equalTo: view.trailingAnchor), + imageView.topAnchor.constraint(equalTo: view.topAnchor), + imageView.bottomAnchor.constraint(equalTo: view.bottomAnchor) + ]) + return view + }() + + let degreeForDayText9: UILabel = { + let degreeNumber = UILabel() + let customDegreeFont = UIFont(name: "SFProText-Medium", size: 22.0) + degreeNumber.font = customDegreeFont + degreeNumber.text = "20°" + degreeNumber.textColor = .white + degreeNumber.textAlignment = .center + + return degreeNumber + }() + + + + override func viewDidLoad() { + super.viewDidLoad() + setBackGroundUI() + self.scrollView.backgroundColor = .clear + setLayout() + + let tapGesture = UITapGestureRecognizer(target: self, action: #selector(tapListIcon)) + listIconView.addGestureRecognizer(tapGesture) + + } + + @objc func tapListIcon() { + let listVC = ListViewController() + self.navigationController?.popViewController(animated: true) + } + + func setBackGroundUI() { + let backgroundImage = UIImageView(frame: UIScreen.main.bounds) + backgroundImage.image = UIImage(named: "bg") + backgroundImage.contentMode = .scaleAspectFill + self.view.addSubview(backgroundImage) + } + + + func setLayout() { + scrollView.showsVerticalScrollIndicator = false + + self.view.addSubview(scrollView) + scrollView.addSubview(contentView) + scrollView.contentInsetAdjustmentBehavior = .never + scrollView.alwaysBounceVertical = true + contentView.addSubview(locationText) + contentView.addSubview(degreeNumber) + contentView.addSubview(statusText) + contentView.addSubview(todayDegreeNumber) + contentView.addSubview(weatherContentView) + self.view.addSubview(bottomView) + self.view.addSubview(mapiconView) + self.view.addSubview(listIconView) + self.view.addSubview(bottomLineView) + self.view.addSubview(horizontalStackView) + weatherContentView.addSubview(forecastText) + weatherContentView.addSubview(lineView) + weatherContentView.addSubview(horizontalScrollView) + horizontalScrollView.addSubview(horizontalContentView) + horizontalScrollView.alwaysBounceHorizontal = true + horizontalContentView.addSubview(verticalStackView) + horizontalContentView.addSubview(verticalStackView2) + horizontalContentView.addSubview(verticalStackView3) + horizontalContentView.addSubview(verticalStackView4) + horizontalContentView.addSubview(verticalStackView5) + horizontalContentView.addSubview(verticalStackView6) + horizontalContentView.addSubview(verticalStackView7) + horizontalContentView.addSubview(verticalStackView8) + horizontalContentView.addSubview(verticalStackView9) + horizontalContentView.addSubview(verticalStackView10) + + directionIconView.translatesAutoresizingMaskIntoConstraints = false + pageIconView.translatesAutoresizingMaskIntoConstraints = false + bottomView.translatesAutoresizingMaskIntoConstraints = false + bottomLineView.translatesAutoresizingMaskIntoConstraints = false + mapiconView.translatesAutoresizingMaskIntoConstraints = false + listIconView.translatesAutoresizingMaskIntoConstraints = false + scrollView.translatesAutoresizingMaskIntoConstraints = false + contentView.translatesAutoresizingMaskIntoConstraints = false + horizontalContentView.translatesAutoresizingMaskIntoConstraints = false + locationText.translatesAutoresizingMaskIntoConstraints = false + degreeNumber.translatesAutoresizingMaskIntoConstraints = false + statusText.translatesAutoresizingMaskIntoConstraints = false + todayDegreeNumber.translatesAutoresizingMaskIntoConstraints = false + weatherContentView.translatesAutoresizingMaskIntoConstraints = false + lineView.translatesAutoresizingMaskIntoConstraints = false + forecastText.translatesAutoresizingMaskIntoConstraints = false + verticalStackView.translatesAutoresizingMaskIntoConstraints = false + horizontalStackView.translatesAutoresizingMaskIntoConstraints = false + iconView.translatesAutoresizingMaskIntoConstraints = false + timeLabel.translatesAutoresizingMaskIntoConstraints = false + horizontalScrollView.translatesAutoresizingMaskIntoConstraints = false + degreeForDayText.translatesAutoresizingMaskIntoConstraints = false + verticalStackView2.translatesAutoresizingMaskIntoConstraints = false + iconView2.translatesAutoresizingMaskIntoConstraints = false + timeLabel2.translatesAutoresizingMaskIntoConstraints = false + degreeForDayText2.translatesAutoresizingMaskIntoConstraints = false + + verticalStackView3.translatesAutoresizingMaskIntoConstraints = false + iconView3.translatesAutoresizingMaskIntoConstraints = false + timeLabel3.translatesAutoresizingMaskIntoConstraints = false + degreeForDayText3.translatesAutoresizingMaskIntoConstraints = false + + verticalStackView4.translatesAutoresizingMaskIntoConstraints = false + iconView4.translatesAutoresizingMaskIntoConstraints = false + timeLabel4.translatesAutoresizingMaskIntoConstraints = false + degreeForDayText4.translatesAutoresizingMaskIntoConstraints = false + + verticalStackView5.translatesAutoresizingMaskIntoConstraints = false + iconView5.translatesAutoresizingMaskIntoConstraints = false + timeLabel5.translatesAutoresizingMaskIntoConstraints = false + degreeForDayText5.translatesAutoresizingMaskIntoConstraints = false + + verticalStackView6.translatesAutoresizingMaskIntoConstraints = false + iconView6.translatesAutoresizingMaskIntoConstraints = false + timeLabel6.translatesAutoresizingMaskIntoConstraints = false + degreeForDayText6.translatesAutoresizingMaskIntoConstraints = false + + verticalStackView7.translatesAutoresizingMaskIntoConstraints = false + iconView7.translatesAutoresizingMaskIntoConstraints = false + timeLabel7.translatesAutoresizingMaskIntoConstraints = false + degreeForDayText7.translatesAutoresizingMaskIntoConstraints = false + + verticalStackView8.translatesAutoresizingMaskIntoConstraints = false + iconView8.translatesAutoresizingMaskIntoConstraints = false + timeLabel8.translatesAutoresizingMaskIntoConstraints = false + degreeForDayText8.translatesAutoresizingMaskIntoConstraints = false + + verticalStackView9.translatesAutoresizingMaskIntoConstraints = false + iconView9.translatesAutoresizingMaskIntoConstraints = false + timeLabel9.translatesAutoresizingMaskIntoConstraints = false + degreeForDayText9.translatesAutoresizingMaskIntoConstraints = false + + verticalStackView10.translatesAutoresizingMaskIntoConstraints = false + iconView10.translatesAutoresizingMaskIntoConstraints = false + timeLabel10.translatesAutoresizingMaskIntoConstraints = false + degreeForDayText10.translatesAutoresizingMaskIntoConstraints = false + + + + verticalStackView.addArrangedSubview(timeLabel) + verticalStackView.addArrangedSubview(iconView) + verticalStackView.addArrangedSubview(degreeForDayText) + + verticalStackView2.addArrangedSubview(timeLabel2) + verticalStackView2.addArrangedSubview(iconView2) + verticalStackView2.addArrangedSubview(degreeForDayText2) + + verticalStackView3.addArrangedSubview(timeLabel3) + verticalStackView3.addArrangedSubview(iconView3) + verticalStackView3.addArrangedSubview(degreeForDayText3) + + verticalStackView4.addArrangedSubview(timeLabel4) + verticalStackView4.addArrangedSubview(iconView4) + verticalStackView4.addArrangedSubview(degreeForDayText4) + + verticalStackView5.addArrangedSubview(timeLabel5) + verticalStackView5.addArrangedSubview(iconView5) + verticalStackView5.addArrangedSubview(degreeForDayText5) + + verticalStackView6.addArrangedSubview(timeLabel6) + verticalStackView6.addArrangedSubview(iconView6) + verticalStackView6.addArrangedSubview(degreeForDayText6) + + verticalStackView7.addArrangedSubview(timeLabel7) + verticalStackView7.addArrangedSubview(iconView7) + verticalStackView7.addArrangedSubview(degreeForDayText7) + + verticalStackView8.addArrangedSubview(timeLabel8) + verticalStackView8.addArrangedSubview(iconView8) + verticalStackView8.addArrangedSubview(degreeForDayText8) + + verticalStackView9.addArrangedSubview(timeLabel9) + verticalStackView9.addArrangedSubview(iconView9) + verticalStackView9.addArrangedSubview(degreeForDayText9) + + verticalStackView10.addArrangedSubview(timeLabel10) + verticalStackView10.addArrangedSubview(iconView10) + verticalStackView10.addArrangedSubview(degreeForDayText10) + + horizontalStackView.addArrangedSubview(directionIconView) + horizontalStackView.addArrangedSubview(pageIconView) + + + NSLayoutConstraint.activate([scrollView.topAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.topAnchor), + scrollView.leadingAnchor.constraint(equalTo: self.view.leadingAnchor), + scrollView.trailingAnchor.constraint(equalTo: self.view.trailingAnchor), + scrollView.bottomAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.bottomAnchor)]) + + NSLayoutConstraint.activate([contentView.leadingAnchor.constraint(equalTo: scrollView.contentLayoutGuide.leadingAnchor), + contentView.trailingAnchor.constraint(equalTo: scrollView.contentLayoutGuide.trailingAnchor), + contentView.topAnchor.constraint(equalTo: scrollView.contentLayoutGuide.topAnchor, constant: 0), + contentView.bottomAnchor.constraint(equalTo: scrollView.contentLayoutGuide.bottomAnchor)]) + + contentView.widthAnchor.constraint(equalTo: scrollView.widthAnchor).isActive = true + let contentViewHeight = contentView.heightAnchor.constraint(greaterThanOrEqualTo: view.heightAnchor) + contentViewHeight.priority = .defaultLow + contentViewHeight.isActive = true + + NSLayoutConstraint.activate([ + bottomView.bottomAnchor.constraint(equalTo: self.contentView.bottomAnchor, constant: 34), + bottomView.leadingAnchor.constraint(equalTo: self.contentView.leadingAnchor), + bottomView.trailingAnchor.constraint(equalTo: self.contentView.trailingAnchor) + ]) + + + NSLayoutConstraint.activate([mapiconView.bottomAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.bottomAnchor), + mapiconView.leadingAnchor.constraint(equalTo: self.view.leadingAnchor, constant: 10)]) + + NSLayoutConstraint.activate([listIconView.bottomAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.bottomAnchor), + listIconView.trailingAnchor.constraint(equalTo: self.view.trailingAnchor, constant: -10)]) + + NSLayoutConstraint.activate([bottomLineView.bottomAnchor.constraint(equalTo: mapiconView.topAnchor, constant: -4), + bottomLineView.leadingAnchor.constraint(equalTo: self.view.leadingAnchor), + bottomLineView.trailingAnchor.constraint(equalTo: self.view.trailingAnchor), + bottomLineView.heightAnchor.constraint(equalToConstant: 1) + ]) + + NSLayoutConstraint.activate([ + locationText.topAnchor.constraint(equalTo: self.contentView.topAnchor, constant: 34), + locationText.centerXAnchor.constraint(equalTo: self.contentView.centerXAnchor)]) + + NSLayoutConstraint.activate([ + degreeNumber.topAnchor.constraint(equalTo: locationText.bottomAnchor, constant: 4), + degreeNumber.centerXAnchor.constraint(equalTo: self.contentView.centerXAnchor)]) + + NSLayoutConstraint.activate([ + statusText.topAnchor.constraint(equalTo: degreeNumber.bottomAnchor, constant: 4), + statusText.centerXAnchor.constraint(equalTo: self.contentView.centerXAnchor)]) + + NSLayoutConstraint.activate([ + todayDegreeNumber.topAnchor.constraint(equalTo: statusText.bottomAnchor, constant: 4), + todayDegreeNumber.centerXAnchor.constraint(equalTo: self.contentView.centerXAnchor)]) + + NSLayoutConstraint.activate([ + weatherContentView.topAnchor.constraint(equalTo: todayDegreeNumber.bottomAnchor, constant: 44), + weatherContentView.leadingAnchor.constraint(equalTo: self.contentView.leadingAnchor, constant: 20), weatherContentView.trailingAnchor.constraint(equalTo: self.contentView.trailingAnchor, constant: -20), + weatherContentView.heightAnchor.constraint(equalToConstant: 212) + ]) + + NSLayoutConstraint.activate([ + forecastText.leadingAnchor.constraint(equalTo: weatherContentView.leadingAnchor, constant: 14.0), + forecastText.trailingAnchor.constraint(equalTo: weatherContentView.trailingAnchor, constant: -14.0), + forecastText.topAnchor.constraint(equalTo: weatherContentView.topAnchor, constant: 10) + ]) + + NSLayoutConstraint.activate([ + lineView.leadingAnchor.constraint(equalTo: weatherContentView.leadingAnchor, constant: 14.0), + lineView.trailingAnchor.constraint(equalTo: weatherContentView.trailingAnchor, constant: 0), + lineView.topAnchor.constraint(equalTo: forecastText.bottomAnchor, constant: 11), + lineView.heightAnchor.constraint(equalToConstant: 0.2) + ]) + + NSLayoutConstraint.activate([ + horizontalScrollView.leadingAnchor.constraint(equalTo: lineView.leadingAnchor, constant: 0.0), + horizontalScrollView.topAnchor.constraint(equalTo: lineView.bottomAnchor, constant: 13), + horizontalScrollView.bottomAnchor.constraint(equalTo: weatherContentView.bottomAnchor, constant: -10), + horizontalScrollView.trailingAnchor.constraint(equalTo: weatherContentView.trailingAnchor) + ]) + + NSLayoutConstraint.activate([horizontalContentView.leadingAnchor.constraint(equalTo: horizontalScrollView.leadingAnchor), + horizontalContentView.topAnchor.constraint(equalTo: horizontalScrollView.topAnchor, constant: 0), + horizontalContentView.bottomAnchor.constraint(equalTo: horizontalScrollView.bottomAnchor), + horizontalContentView.trailingAnchor.constraint(equalTo: horizontalScrollView.trailingAnchor) + + ]) + horizontalContentView.heightAnchor.constraint(equalTo: horizontalScrollView.heightAnchor).isActive = true + let contentViewWidth = horizontalContentView.widthAnchor.constraint(greaterThanOrEqualTo: view.widthAnchor) + contentViewWidth.priority = .defaultLow + contentViewWidth.isActive = true + + NSLayoutConstraint.activate([ + verticalStackView.leadingAnchor.constraint(equalTo: horizontalContentView.leadingAnchor, constant: 0.0), + verticalStackView.topAnchor.constraint(equalTo: horizontalContentView.topAnchor), + verticalStackView.bottomAnchor.constraint(equalTo: horizontalContentView.bottomAnchor, constant: 0) + ]) + + NSLayoutConstraint.activate([ + verticalStackView2.leadingAnchor.constraint(equalTo: verticalStackView.trailingAnchor, constant: 22.0), + verticalStackView2.topAnchor.constraint(equalTo: horizontalContentView.topAnchor), + verticalStackView2.bottomAnchor.constraint(equalTo: horizontalContentView.bottomAnchor, constant: 0) + ]) + + NSLayoutConstraint.activate([ + verticalStackView3.leadingAnchor.constraint(equalTo: verticalStackView2.trailingAnchor, constant: 22), + verticalStackView3.topAnchor.constraint(equalTo: horizontalContentView.topAnchor), + verticalStackView3.bottomAnchor.constraint(equalTo: horizontalContentView.bottomAnchor, constant: 0) + ]) + + NSLayoutConstraint.activate([ + verticalStackView4.leadingAnchor.constraint(equalTo: verticalStackView3.trailingAnchor, constant: 22), + verticalStackView4.topAnchor.constraint(equalTo: horizontalContentView.topAnchor), + verticalStackView4.bottomAnchor.constraint(equalTo: horizontalContentView.bottomAnchor, constant: 0) + ]) + + + NSLayoutConstraint.activate([ + verticalStackView5.leadingAnchor.constraint(equalTo: verticalStackView4.trailingAnchor, constant: 22), + verticalStackView5.topAnchor.constraint(equalTo: horizontalContentView.topAnchor), + verticalStackView5.bottomAnchor.constraint(equalTo: horizontalContentView.bottomAnchor, constant: 0) + ]) + + + NSLayoutConstraint.activate([ + verticalStackView6.leadingAnchor.constraint(equalTo: verticalStackView5.trailingAnchor, constant: 22.0), + verticalStackView6.topAnchor.constraint(equalTo: horizontalContentView.topAnchor), + verticalStackView6.bottomAnchor.constraint(equalTo: horizontalContentView.bottomAnchor, constant: 0) + ]) + + + NSLayoutConstraint.activate([ + verticalStackView7.leadingAnchor.constraint(equalTo: verticalStackView6.trailingAnchor, constant: 22.0), + verticalStackView7.topAnchor.constraint(equalTo: horizontalContentView.topAnchor), + verticalStackView7.bottomAnchor.constraint(equalTo: horizontalContentView.bottomAnchor, constant: 0) + ]) + + NSLayoutConstraint.activate([ + verticalStackView8.leadingAnchor.constraint(equalTo: verticalStackView7.trailingAnchor, constant: 22.0), + verticalStackView8.topAnchor.constraint(equalTo: horizontalContentView.topAnchor), + verticalStackView8.bottomAnchor.constraint(equalTo: horizontalContentView.bottomAnchor, constant: 0) + ]) + + NSLayoutConstraint.activate([ + verticalStackView9.leadingAnchor.constraint(equalTo: verticalStackView8.trailingAnchor, constant: 22.0), + verticalStackView9.topAnchor.constraint(equalTo: horizontalContentView.topAnchor), + verticalStackView9.bottomAnchor.constraint(equalTo: horizontalContentView.bottomAnchor, constant: 0) + ]) + + NSLayoutConstraint.activate([ + verticalStackView10.leadingAnchor.constraint(equalTo: verticalStackView9.trailingAnchor, constant: 22.0), + verticalStackView10.topAnchor.constraint(equalTo: horizontalContentView.topAnchor), + verticalStackView10.bottomAnchor.constraint(equalTo: horizontalContentView.bottomAnchor, constant: 0), + verticalStackView10.trailingAnchor.constraint(equalTo: horizontalContentView.trailingAnchor) + ]) + + + + NSLayoutConstraint.activate([ + timeLabel.leadingAnchor.constraint(equalTo: verticalStackView.leadingAnchor, constant: 0.0), + timeLabel.trailingAnchor.constraint(equalTo: verticalStackView.trailingAnchor, constant: 0), + timeLabel.topAnchor.constraint(equalTo: verticalStackView.topAnchor, constant: 0) + ]) + + NSLayoutConstraint.activate([ + iconView.leadingAnchor.constraint(equalTo: timeLabel.leadingAnchor, constant: 0), + iconView.widthAnchor.constraint(equalToConstant: 40), + iconView.heightAnchor.constraint(equalToConstant: 40) + ]) + + NSLayoutConstraint.activate([ + degreeForDayText.leadingAnchor.constraint(equalTo: timeLabel.leadingAnchor, constant: 0) + ]) + + + NSLayoutConstraint.activate([ + horizontalStackView.topAnchor.constraint(equalTo: bottomLineView.bottomAnchor, constant: 14), + horizontalStackView.heightAnchor.constraint(equalToConstant: 24), + horizontalStackView.widthAnchor.constraint(equalToConstant: 54), + horizontalStackView.centerXAnchor.constraint(equalTo: self.view.centerXAnchor) + ]) + + + + + } + +} + + +#if DEBUG +struct VCPreview: PreviewProvider { + static var previews: some View { + DetailViewController() + .toPreview() + } +} +#endif diff --git a/Weather-App/Weather-App/Info.plist b/Weather-App/Weather-App/Info.plist index 08e2c3a..da6a702 100644 --- a/Weather-App/Weather-App/Info.plist +++ b/Weather-App/Weather-App/Info.plist @@ -4,11 +4,11 @@ UIAppFonts - SF-Pro-Text-Thin.otf - SF-Pro-Text-Regular.otf - SF-Pro-Text-Medium.otf SF-Pro-Text-Bold.otf SF-Pro-Text-Light.otf + SF-Pro-Text-Medium.otf + SF-Pro-Text-Regular.otf + SF-Pro-Text-Thin.otf UIApplicationSceneManifest diff --git a/Weather-App/Weather-App/ListViewController.swift b/Weather-App/Weather-App/ListViewController.swift new file mode 100644 index 0000000..d4791f7 --- /dev/null +++ b/Weather-App/Weather-App/ListViewController.swift @@ -0,0 +1,254 @@ +// +// ListViewController.swift +// Weather-App +// +// Created by yeonsu on 10/19/23. +// + +import UIKit +import SwiftUI + +class ListViewController: UIViewController { + + let nextViewController = DetailViewController() + + let scrollView = UIScrollView() + var contentView = UIView() + + //MARK: - 객체 생성 + // 더보기 버튼 + let etcButton: UIButton = { + let button = UIButton() + let image = UIImage(named: "icon-etc") + + button.setImage(image, for: .normal) + return button + }() + // 앱 타이틀 + let appTitle: UILabel = { + let title = UILabel() + let customFont = UIFont(name: "SFProText-Bold", size: 36.0) + title.font = customFont + title.text = "날씨" + title.textColor = .white + + return title + }() + // 서치 텍스트필드 + let searchTextField: UITextField = { + let textField = UITextField() + let placeholderTextColor = UIColor.lightGray + textField.borderStyle = .roundedRect + textField.placeholder = "도시 또는 공항 검색" + textField.textColor = .white + + // placeholder 컬러 설정 + let attributes: [NSAttributedString.Key: Any] = [ + NSAttributedString.Key.foregroundColor: placeholderTextColor + ] + textField.attributedPlaceholder = NSAttributedString(string: textField.placeholder ?? "", attributes: attributes) + textField.backgroundColor = .secondarySystemFill + + // 검색 아이콘 설정 + let imageView = UIImageView() + imageView.frame = CGRect(x: 0, y: 0, width: 24, height: 24) + imageView.image = UIImage(named: "icon-search") + textField.leftView = imageView + textField.leftViewMode = .always + + let marginView = UIView() + imageView.frame = CGRect(x: 0, y: 0, width: 8, height: 24) + + + return textField + }() + // 리스트 뷰 + let listView: UIView = { + let view = UIView() + let imageView = UIImageView() + imageView.image = UIImage(named: "bg-list") + imageView.contentMode = .scaleAspectFill + + view.addSubview(imageView) + view.sendSubviewToBack(imageView) + + imageView.translatesAutoresizingMaskIntoConstraints = false + NSLayoutConstraint.activate([ + + imageView.leadingAnchor.constraint(equalTo: view.leadingAnchor), + imageView.trailingAnchor.constraint(equalTo: view.trailingAnchor), + imageView.topAnchor.constraint(equalTo: view.topAnchor), + imageView.bottomAnchor.constraint(equalTo: view.bottomAnchor) + ]) + + let title = UILabel() + let customTitleFont = UIFont(name: "SFProText-Bold", size: 24.0) + title.font = customTitleFont + title.text = "나의 위치" + title.textColor = .white + + view.addSubview(title) + title.translatesAutoresizingMaskIntoConstraints = false + NSLayoutConstraint.activate([ + title.leadingAnchor.constraint(equalTo: imageView.leadingAnchor, constant: 16), + title.topAnchor.constraint(equalTo: imageView.topAnchor, constant: 10) + ]) + + let locationTitle = UILabel() + let customLocationFont = UIFont(name: "SFProText-Regular", size: 17.0) + locationTitle.font = customLocationFont + locationTitle.text = "의정부시" + locationTitle.textColor = .white + + view.addSubview(locationTitle) + locationTitle.translatesAutoresizingMaskIntoConstraints = false + NSLayoutConstraint.activate([ + locationTitle.leadingAnchor.constraint(equalTo: title.leadingAnchor), + locationTitle.topAnchor.constraint(equalTo: title.bottomAnchor, constant: 2) + ]) + + let degreeNumber = UILabel() + let customDegreeFont = UIFont(name: "SFProText-Light", size: 52.0) + degreeNumber.font = customDegreeFont + degreeNumber.text = "21°" + degreeNumber.textColor = .white + + view.addSubview(degreeNumber) + degreeNumber.translatesAutoresizingMaskIntoConstraints = false + NSLayoutConstraint.activate([ + degreeNumber.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -16), + degreeNumber.topAnchor.constraint(equalTo: view.topAnchor, constant: 4) + ]) + + let statusText = UILabel() + let customStatusFont = UIFont(name: "SFProText-Regular", size: 16.0) + statusText.font = customStatusFont + statusText.text = "흐림" + statusText.textColor = .white + + view.addSubview(statusText) + statusText.translatesAutoresizingMaskIntoConstraints = false + NSLayoutConstraint.activate([ + statusText.leadingAnchor.constraint(equalTo: locationTitle.leadingAnchor), + statusText.bottomAnchor.constraint(equalTo: imageView.bottomAnchor, constant: -10) + ]) + + let todayDegreeNumber = UILabel() + let customTodayDegreeFont = UIFont(name: "SFProText-Regular", size: 16.0) + todayDegreeNumber.font = customTodayDegreeFont + todayDegreeNumber.text = "최고:29° 최저:15°" + todayDegreeNumber.textColor = .white + + view.addSubview(todayDegreeNumber) + todayDegreeNumber.translatesAutoresizingMaskIntoConstraints = false + NSLayoutConstraint.activate([ + todayDegreeNumber.trailingAnchor.constraint(equalTo: degreeNumber.trailingAnchor), + todayDegreeNumber.bottomAnchor.constraint(equalTo: imageView.bottomAnchor, constant: -10) + ]) + + return view + }() + + + override func viewDidLoad() { + super.viewDidLoad() + + self.navigationController?.isNavigationBarHidden = true + + scrollView.showsVerticalScrollIndicator = false + + self.view.addSubview(scrollView) + scrollView.addSubview(contentView) + scrollView.alwaysBounceVertical = true + + self.contentView.backgroundColor = .black + self.contentView.addSubview(etcButton) + self.contentView.addSubview(appTitle) + self.contentView.addSubview(searchTextField) + self.contentView.addSubview(listView) + + scrollView.translatesAutoresizingMaskIntoConstraints = false + contentView.translatesAutoresizingMaskIntoConstraints = false + etcButton.translatesAutoresizingMaskIntoConstraints = false + appTitle.translatesAutoresizingMaskIntoConstraints = false + searchTextField.translatesAutoresizingMaskIntoConstraints = false + listView.translatesAutoresizingMaskIntoConstraints = false + + NSLayoutConstraint.activate([scrollView.topAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.topAnchor), + scrollView.leadingAnchor.constraint(equalTo: self.view.leadingAnchor), + scrollView.trailingAnchor.constraint(equalTo: self.view.trailingAnchor), + scrollView.bottomAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.bottomAnchor)]) + + NSLayoutConstraint.activate([contentView.leadingAnchor.constraint(equalTo: scrollView.contentLayoutGuide.leadingAnchor), + contentView.trailingAnchor.constraint(equalTo: scrollView.contentLayoutGuide.trailingAnchor), + contentView.topAnchor.constraint(equalTo: scrollView.contentLayoutGuide.topAnchor, constant: 0), + contentView.bottomAnchor.constraint(equalTo: scrollView.contentLayoutGuide.bottomAnchor)]) + + contentView.widthAnchor.constraint(equalTo: scrollView.widthAnchor).isActive = true + let contentViewHeight = contentView.heightAnchor.constraint(greaterThanOrEqualTo: view.heightAnchor) + contentViewHeight.priority = .defaultLow + contentViewHeight.isActive = true + + NSLayoutConstraint.activate([ + etcButton.trailingAnchor.constraint(equalTo: self.contentView.trailingAnchor, constant: -10), + etcButton.topAnchor.constraint(equalTo: contentView.safeAreaLayoutGuide.topAnchor, constant: 8), + etcButton.heightAnchor.constraint(equalToConstant: 44), + etcButton.widthAnchor.constraint(equalToConstant: 44) + ]) + + NSLayoutConstraint.activate([ + appTitle.topAnchor.constraint(equalTo: etcButton.bottomAnchor, constant: 0), + appTitle.leadingAnchor.constraint(equalTo: contentView.leadingAnchor, constant: 20) + ]) + + NSLayoutConstraint.activate([ + searchTextField.leadingAnchor.constraint(equalTo: contentView.leadingAnchor, constant: 20), + searchTextField.trailingAnchor.constraint(equalTo: contentView.trailingAnchor, constant: -20), + searchTextField.heightAnchor.constraint(equalToConstant: 40), + searchTextField.topAnchor.constraint(equalTo: appTitle.bottomAnchor, constant: 8) + ]) + + NSLayoutConstraint.activate([ + listView.leadingAnchor.constraint(equalTo: contentView.leadingAnchor, constant: 20), + listView.trailingAnchor.constraint(equalTo: contentView.trailingAnchor, constant: -20), + listView.heightAnchor.constraint(equalToConstant: 117), + listView.topAnchor.constraint(equalTo: searchTextField.bottomAnchor, constant: 15) + ]) + + let tapGesture = UITapGestureRecognizer(target: self, action: #selector(tapMyLocationView)) + listView.addGestureRecognizer(tapGesture) + } + + @objc func tapMyLocationView() { + let detailVC = DetailViewController() + self.navigationController?.pushViewController(detailVC, animated: true) + } +} + + +extension UIViewController { + private struct Preview: UIViewControllerRepresentable { + let vc: UIViewController + + func makeUIViewController(context: Context) -> UIViewController { + return vc + } + + func updateUIViewController(_ uiViewController: UIViewController, context: Context) { + } + } + + func toPreview() -> some View { + Preview(vc: self) + } +} + + +#if DEBUG +struct ViewControllerPreview: PreviewProvider { + static var previews: some View { + ListViewController() + .toPreview() + } +} +#endif diff --git a/Weather-App/Weather-App/SceneDelegate.swift b/Weather-App/Weather-App/SceneDelegate.swift index 9ba8877..852059a 100644 --- a/Weather-App/Weather-App/SceneDelegate.swift +++ b/Weather-App/Weather-App/SceneDelegate.swift @@ -18,10 +18,15 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { // This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead). guard let windowScene = (scene as? UIWindowScene) else { return } - let window = UIWindow(windowScene: windowScene) - window.rootViewController = ViewController() - window.makeKeyAndVisible() - self.window = window +// let window = UIWindow(windowScene: windowScene) +// window.rootViewController = ListViewController() +// window.makeKeyAndVisible() +// self.window = window + + window = UIWindow(windowScene: windowScene) + let mainViewController = UINavigationController(rootViewController: ListViewController()) + window?.rootViewController = mainViewController + window?.makeKeyAndVisible() } func sceneDidDisconnect(_ scene: UIScene) { diff --git a/Weather-App/Weather-App/ViewController.swift b/Weather-App/Weather-App/ViewController.swift deleted file mode 100644 index 467525d..0000000 --- a/Weather-App/Weather-App/ViewController.swift +++ /dev/null @@ -1,21 +0,0 @@ -// -// ViewController.swift -// Weather-App -// -// Created by yeonsu on 10/19/23. -// - -import UIKit - -class ViewController: UIViewController { - - override func viewDidLoad() { - super.viewDidLoad() - // Do any additional setup after loading the view. - - self.view.backgroundColor = .red - } - - -} -