From f05bf0ce8a1125bd4926624d44f0e67dd19762c3 Mon Sep 17 00:00:00 2001 From: sarang3009 Date: Fri, 7 Apr 2023 04:02:19 +0900 Subject: [PATCH 1/3] =?UTF-8?q?=EC=BD=94=EB=93=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../GO-SOPT-FIRST-SEMINAR/ViewController.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GO-SOPT-FIRST-SEMINAR/GO-SOPT-FIRST-SEMINAR/ViewController.swift b/GO-SOPT-FIRST-SEMINAR/GO-SOPT-FIRST-SEMINAR/ViewController.swift index a5c1d6f..04011ba 100644 --- a/GO-SOPT-FIRST-SEMINAR/GO-SOPT-FIRST-SEMINAR/ViewController.swift +++ b/GO-SOPT-FIRST-SEMINAR/GO-SOPT-FIRST-SEMINAR/ViewController.swift @@ -7,7 +7,7 @@ import UIKit -class ViewController: UIViewController { +final class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() From 57023b88f0568b7b4f48e79e161cbfbe3b82c204 Mon Sep 17 00:00:00 2001 From: sarang3009 Date: Fri, 7 Apr 2023 21:46:28 +0900 Subject: [PATCH 2/3] =?UTF-8?q?1=EC=B0=A8=20=EA=B3=BC=EC=A0=9C=20=EC=97=85?= =?UTF-8?q?=EB=A1=9C=EB=93=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../project.pbxproj | 22 +-- .../GO-SOPT-FIRST-SEMINAR/Info.plist | 2 - .../NewViewController.swift | 161 ++++++++++++++++++ .../GO-SOPT-FIRST-SEMINAR/SceneDelegate.swift | 50 ++---- .../SecondViewController.swift | 83 +++++++++ .../ViewController.swift | 29 +++- 6 files changed, 290 insertions(+), 57 deletions(-) create mode 100644 GO-SOPT-FIRST-SEMINAR/GO-SOPT-FIRST-SEMINAR/NewViewController.swift create mode 100644 GO-SOPT-FIRST-SEMINAR/GO-SOPT-FIRST-SEMINAR/SecondViewController.swift diff --git a/GO-SOPT-FIRST-SEMINAR/GO-SOPT-FIRST-SEMINAR.xcodeproj/project.pbxproj b/GO-SOPT-FIRST-SEMINAR/GO-SOPT-FIRST-SEMINAR.xcodeproj/project.pbxproj index b32d6e9..a7105c9 100644 --- a/GO-SOPT-FIRST-SEMINAR/GO-SOPT-FIRST-SEMINAR.xcodeproj/project.pbxproj +++ b/GO-SOPT-FIRST-SEMINAR/GO-SOPT-FIRST-SEMINAR.xcodeproj/project.pbxproj @@ -10,9 +10,10 @@ 7EB7B90329DF4A3600C2A7F6 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7EB7B90229DF4A3600C2A7F6 /* AppDelegate.swift */; }; 7EB7B90529DF4A3600C2A7F6 /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7EB7B90429DF4A3600C2A7F6 /* SceneDelegate.swift */; }; 7EB7B90729DF4A3600C2A7F6 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7EB7B90629DF4A3600C2A7F6 /* ViewController.swift */; }; - 7EB7B90A29DF4A3600C2A7F6 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 7EB7B90829DF4A3600C2A7F6 /* Main.storyboard */; }; 7EB7B90C29DF4A3A00C2A7F6 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 7EB7B90B29DF4A3A00C2A7F6 /* Assets.xcassets */; }; 7EB7B90F29DF4A3A00C2A7F6 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 7EB7B90D29DF4A3A00C2A7F6 /* LaunchScreen.storyboard */; }; + 7EB7B91729DF54D300C2A7F6 /* NewViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7EB7B91629DF54D300C2A7F6 /* NewViewController.swift */; }; + 7EB7B91929DF564F00C2A7F6 /* SecondViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7EB7B91829DF564F00C2A7F6 /* SecondViewController.swift */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ @@ -20,10 +21,11 @@ 7EB7B90229DF4A3600C2A7F6 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 7EB7B90429DF4A3600C2A7F6 /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = ""; }; 7EB7B90629DF4A3600C2A7F6 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; - 7EB7B90929DF4A3600C2A7F6 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 7EB7B90B29DF4A3A00C2A7F6 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 7EB7B90E29DF4A3A00C2A7F6 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 7EB7B91029DF4A3A00C2A7F6 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 7EB7B91629DF54D300C2A7F6 /* NewViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NewViewController.swift; sourceTree = ""; }; + 7EB7B91829DF564F00C2A7F6 /* SecondViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SecondViewController.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -59,10 +61,11 @@ 7EB7B90229DF4A3600C2A7F6 /* AppDelegate.swift */, 7EB7B90429DF4A3600C2A7F6 /* SceneDelegate.swift */, 7EB7B90629DF4A3600C2A7F6 /* ViewController.swift */, - 7EB7B90829DF4A3600C2A7F6 /* Main.storyboard */, 7EB7B90B29DF4A3A00C2A7F6 /* Assets.xcassets */, 7EB7B90D29DF4A3A00C2A7F6 /* LaunchScreen.storyboard */, 7EB7B91029DF4A3A00C2A7F6 /* Info.plist */, + 7EB7B91629DF54D300C2A7F6 /* NewViewController.swift */, + 7EB7B91829DF564F00C2A7F6 /* SecondViewController.swift */, ); path = "GO-SOPT-FIRST-SEMINAR"; sourceTree = ""; @@ -127,7 +130,6 @@ files = ( 7EB7B90F29DF4A3A00C2A7F6 /* LaunchScreen.storyboard in Resources */, 7EB7B90C29DF4A3A00C2A7F6 /* Assets.xcassets in Resources */, - 7EB7B90A29DF4A3600C2A7F6 /* Main.storyboard in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -141,20 +143,14 @@ 7EB7B90729DF4A3600C2A7F6 /* ViewController.swift in Sources */, 7EB7B90329DF4A3600C2A7F6 /* AppDelegate.swift in Sources */, 7EB7B90529DF4A3600C2A7F6 /* SceneDelegate.swift in Sources */, + 7EB7B91929DF564F00C2A7F6 /* SecondViewController.swift in Sources */, + 7EB7B91729DF54D300C2A7F6 /* NewViewController.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin PBXVariantGroup section */ - 7EB7B90829DF4A3600C2A7F6 /* Main.storyboard */ = { - isa = PBXVariantGroup; - children = ( - 7EB7B90929DF4A3600C2A7F6 /* Base */, - ); - name = Main.storyboard; - sourceTree = ""; - }; 7EB7B90D29DF4A3A00C2A7F6 /* LaunchScreen.storyboard */ = { isa = PBXVariantGroup; children = ( @@ -292,7 +288,6 @@ INFOPLIST_FILE = "GO-SOPT-FIRST-SEMINAR/Info.plist"; INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen; - INFOPLIST_KEY_UIMainStoryboardFile = Main; INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; LD_RUNPATH_SEARCH_PATHS = ( @@ -320,7 +315,6 @@ INFOPLIST_FILE = "GO-SOPT-FIRST-SEMINAR/Info.plist"; INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen; - INFOPLIST_KEY_UIMainStoryboardFile = Main; INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; LD_RUNPATH_SEARCH_PATHS = ( diff --git a/GO-SOPT-FIRST-SEMINAR/GO-SOPT-FIRST-SEMINAR/Info.plist b/GO-SOPT-FIRST-SEMINAR/GO-SOPT-FIRST-SEMINAR/Info.plist index dd3c9af..0eb786d 100644 --- a/GO-SOPT-FIRST-SEMINAR/GO-SOPT-FIRST-SEMINAR/Info.plist +++ b/GO-SOPT-FIRST-SEMINAR/GO-SOPT-FIRST-SEMINAR/Info.plist @@ -15,8 +15,6 @@ Default Configuration UISceneDelegateClassName $(PRODUCT_MODULE_NAME).SceneDelegate - UISceneStoryboardFile - Main diff --git a/GO-SOPT-FIRST-SEMINAR/GO-SOPT-FIRST-SEMINAR/NewViewController.swift b/GO-SOPT-FIRST-SEMINAR/GO-SOPT-FIRST-SEMINAR/NewViewController.swift new file mode 100644 index 0000000..f80c94b --- /dev/null +++ b/GO-SOPT-FIRST-SEMINAR/GO-SOPT-FIRST-SEMINAR/NewViewController.swift @@ -0,0 +1,161 @@ +// +// NewViewController.swift +// GO-SOPT-FIRST-SEMINAR +// +// Created by 김사랑 on 2023/04/07. +// + +import UIKit + +class NewViewController: UIViewController { + + private let nameLabel: UILabel = { + let label = UILabel() + label.text = "이름이 무엇인가요🥸" + label.font = .boldSystemFont(ofSize: 20) + label.textColor = .black + label.textAlignment = .center + return label + }() + + private let valueSlider: UISlider = { + let slider = UISlider() + slider.minimumValue = 0 + slider.maximumValue = 100 + slider.value = 50 + slider.minimumTrackTintColor = .black + return slider + }() + + private lazy var presentButton: UIButton = { + let button = UIButton() + button.setTitle("present", for: .normal) + button.backgroundColor = .black + button.layer.cornerRadius = 10 + button.layer.shadowColor = UIColor.black.cgColor + button.layer.shadowOpacity = 0.4 //투명도 + button.layer.shadowOffset = CGSize.zero //위치 + button.layer.shadowRadius = 7 //반경 + + button.setTitleColor(.white, for: .normal) + + button.addTarget(self, + action: #selector(presentButtonTapped), + for: .touchUpInside) + + return button + }() + + private lazy var pushButton: UIButton = { + let button = UIButton() + button.setTitle("push", for: .normal) + button.backgroundColor = .black + button.layer.cornerRadius = 10 + button.layer.shadowColor = UIColor.black.cgColor + button.layer.shadowOpacity = 0.4 //투명도 + button.layer.shadowOffset = CGSize.zero //위치 + button.layer.shadowRadius = 7 //반경 + button.setTitleColor(.white, for: .normal) + + button.addTarget(self, + action: #selector(pushButtonTapped), + for: .touchUpInside) + + return button + }() + + private let nameTextField: UITextField = { + let textField = UITextField() + textField.placeholder = "이름을 적어주세요 :)" + textField.clearButtonMode = .whileEditing + textField.layer.borderColor = UIColor.black.cgColor + textField.layer.cornerRadius = 10 + textField.layer.borderWidth = 0.1 + textField.leftView = UIView(frame: CGRect(x: 0.0, y: 0.0, width: 15.0, height: 0.0)) //여백주기 + textField.leftViewMode = .always + + return textField + }() + + override func viewDidLoad() { + super.viewDidLoad() + + style() + setLayout() + // Do any additional setup after loading the view. + } + + + +} + +private extension NewViewController { + + func style() { + + view.backgroundColor = .white + } + + func setLayout() { + + [nameLabel, nameTextField, + presentButton, pushButton, valueSlider].forEach { + $0.translatesAutoresizingMaskIntoConstraints = false + view.addSubview($0) + } + + NSLayoutConstraint.activate([nameLabel.topAnchor.constraint(equalTo: view.topAnchor, constant: 300), + nameLabel.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 30), + nameLabel.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -30)]) + + NSLayoutConstraint.activate([valueSlider.topAnchor.constraint(equalTo: nameLabel.bottomAnchor, constant: 10), + valueSlider.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 30), + valueSlider.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -30)]) + + NSLayoutConstraint.activate([nameTextField.topAnchor.constraint(equalTo: valueSlider.bottomAnchor, constant: 10), + nameTextField.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 30), + nameTextField.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -30), + nameTextField.heightAnchor.constraint(equalToConstant: 48)]) + + NSLayoutConstraint.activate([presentButton.topAnchor.constraint(equalTo: nameTextField.bottomAnchor, constant: 20), + presentButton.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 30), + presentButton.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -30), + presentButton.heightAnchor.constraint(equalToConstant: 48)]) + + NSLayoutConstraint.activate([pushButton.topAnchor.constraint(equalTo: presentButton.bottomAnchor, constant: 20), + pushButton.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 30), + pushButton.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -30), + pushButton.heightAnchor.constraint(equalToConstant: 48)]) + } + + func presentToSecondViewController() { + + let secondViewController = SecondViewController_1st_Seminar() + secondViewController.modalPresentationStyle = .fullScreen + self.present(secondViewController, animated: true) + } + + func pushToSecondViewController() { + + let secondViewController = SecondViewController_1st_Seminar() + if let name = nameTextField.text{ + secondViewController.dataBind(name: name) + } + self.navigationController?.pushViewController(secondViewController, animated: true) + } + + @objc + func presentButtonTapped() { + + presentToSecondViewController() + } + + @objc + func pushButtonTapped() { + + pushToSecondViewController() + } + + + +} diff --git a/GO-SOPT-FIRST-SEMINAR/GO-SOPT-FIRST-SEMINAR/SceneDelegate.swift b/GO-SOPT-FIRST-SEMINAR/GO-SOPT-FIRST-SEMINAR/SceneDelegate.swift index 07c0a25..b20083d 100644 --- a/GO-SOPT-FIRST-SEMINAR/GO-SOPT-FIRST-SEMINAR/SceneDelegate.swift +++ b/GO-SOPT-FIRST-SEMINAR/GO-SOPT-FIRST-SEMINAR/SceneDelegate.swift @@ -8,45 +8,19 @@ import UIKit class SceneDelegate: UIResponder, UIWindowSceneDelegate { - + var window: UIWindow? - - + func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) { - // Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`. - // If using a storyboard, the `window` property will automatically be initialized and attached to the scene. - // This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead). - guard let _ = (scene as? UIWindowScene) else { return } - } - - func sceneDidDisconnect(_ scene: UIScene) { - // Called as the scene is being released by the system. - // This occurs shortly after the scene enters the background, or when its session is discarded. - // Release any resources associated with this scene that can be re-created the next time the scene connects. - // The scene may re-connect later, as its session was not necessarily discarded (see `application:didDiscardSceneSessions` instead). - } - - func sceneDidBecomeActive(_ scene: UIScene) { - // Called when the scene has moved from an inactive state to an active state. - // Use this method to restart any tasks that were paused (or not yet started) when the scene was inactive. - } - - func sceneWillResignActive(_ scene: UIScene) { - // Called when the scene will move from an active state to an inactive state. - // This may occur due to temporary interruptions (ex. an incoming phone call). - } - - func sceneWillEnterForeground(_ scene: UIScene) { - // Called as the scene transitions from the background to the foreground. - // Use this method to undo the changes made on entering the background. - } - - func sceneDidEnterBackground(_ scene: UIScene) { - // Called as the scene transitions from the foreground to the background. - // Use this method to save data, release shared resources, and store enough scene-specific state information - // to restore the scene back to its current state. + + // 1. + guard let windowScene = (scene as? UIWindowScene) else { return } + // 2. + self.window = UIWindow(windowScene: windowScene) + // 3. + let navigationController = UINavigationController(rootViewController: NewViewController()) + self.window?.rootViewController = navigationController + // 4. + self.window?.makeKeyAndVisible() } - - } - diff --git a/GO-SOPT-FIRST-SEMINAR/GO-SOPT-FIRST-SEMINAR/SecondViewController.swift b/GO-SOPT-FIRST-SEMINAR/GO-SOPT-FIRST-SEMINAR/SecondViewController.swift new file mode 100644 index 0000000..fcbf9f2 --- /dev/null +++ b/GO-SOPT-FIRST-SEMINAR/GO-SOPT-FIRST-SEMINAR/SecondViewController.swift @@ -0,0 +1,83 @@ +// +// SecondViewController.swift +// GO-SOPT-FIRST-SEMINAR +// +// Created by 김사랑 on 2023/04/07. +// + +import UIKit + +final class SecondViewController_1st_Seminar: UIViewController { + + private let nameLabel: UILabel = { + let label = UILabel() + label.text = "반가워요!" + label.font = .boldSystemFont(ofSize: 20) + return label + }() + + private lazy var backButton: UIButton = { + let button = UIButton() + button.setTitle("뒤로가기", for: .normal) + button.setTitleColor(.blue, for: .normal) + button.titleLabel?.font = .boldSystemFont(ofSize: 20) + + button.addTarget(self, + action: #selector(backButtonTapped), + for: .touchUpInside) + + return button + }() + + override func viewDidLoad() { + super.viewDidLoad() + + style() + setLayout() + + } + + func dataBind(name: String) { + nameLabel.text = name + } + + +} + +private extension SecondViewController_1st_Seminar { + + func style() { + + view.backgroundColor = .white + } + + func setLayout() { + + [nameLabel, backButton].forEach { + $0.translatesAutoresizingMaskIntoConstraints = false + view.addSubview($0) + } + + NSLayoutConstraint.activate([nameLabel.centerXAnchor.constraint(equalTo: view.centerXAnchor), + nameLabel.centerYAnchor.constraint(equalTo: view.centerYAnchor)]) + + + NSLayoutConstraint.activate([backButton.topAnchor.constraint(equalTo: nameLabel.bottomAnchor, constant: 20), + backButton.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 30), + backButton.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -30), + backButton.heightAnchor.constraint(equalToConstant: 48)]) + } + + @objc + func backButtonTapped() { + + if self.navigationController == nil { + self.dismiss(animated: true, completion: nil) + } else { + self.navigationController?.popViewController(animated: true) + } + } + + + +} diff --git a/GO-SOPT-FIRST-SEMINAR/GO-SOPT-FIRST-SEMINAR/ViewController.swift b/GO-SOPT-FIRST-SEMINAR/GO-SOPT-FIRST-SEMINAR/ViewController.swift index 04011ba..8bf88dd 100644 --- a/GO-SOPT-FIRST-SEMINAR/GO-SOPT-FIRST-SEMINAR/ViewController.swift +++ b/GO-SOPT-FIRST-SEMINAR/GO-SOPT-FIRST-SEMINAR/ViewController.swift @@ -8,12 +8,35 @@ import UIKit final class ViewController: UIViewController { + + private let nameLabel: UILabel = { + let label = UILabel() + label.text = "솝트에 오신 여러분 환영합니다!" + return label + }() override func viewDidLoad() { super.viewDidLoad() - // Do any additional setup after loading the view. - } - + setStyle() + setLayout() + } } +private extension ViewController { + + func setStyle() { + + view.backgroundColor = .white + } + + func setLayout() { + + nameLabel.translatesAutoresizingMaskIntoConstraints = false + + view.addSubview(nameLabel) + + NSLayoutConstraint.activate([nameLabel.topAnchor.constraint(equalTo: view.topAnchor, constant: 300), + nameLabel.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 50)]) + } +} From 9812da9f5f4158be3a53db04a22c95c39ace68bc Mon Sep 17 00:00:00 2001 From: sarang3009 Date: Fri, 21 Apr 2023 22:55:32 +0900 Subject: [PATCH 3/3] =?UTF-8?q?2=EC=B0=A8=20=EA=B3=BC=EC=A0=9C-=ED=8B=B0?= =?UTF-8?q?=EB=B9=99=20=ED=81=B4=EB=A1=A0=201=EC=B0=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../GO-SOPT-TVING.xcodeproj/project.pbxproj | 512 ++++++++++++++++++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/swiftpm/Package.resolved | 32 ++ GO-SOPT-TVING/GO-SOPT-TVING/AppDelegate.swift | 36 ++ .../AccentColor.colorset/Contents.json | 11 + .../AppIcon.appiconset/Contents.json | 13 + .../Assets.xcassets/Contents.json | 6 + .../Base.lproj/LaunchScreen.storyboard | 25 + .../GO-SOPT-TVING/Base.lproj/Main.storyboard | 24 + .../GO-SOPT-TVING/Extension/UIButton+.swift | 22 + .../GO-SOPT-TVING/Extension/UIColor+.swift | 54 ++ .../GO-SOPT-TVING/Extension/UIFont+.swift | 34 ++ .../Extension/UITextField+.swift | 37 ++ .../GO-SOPT-TVING/Extension/UIView+.swift | 14 + GO-SOPT-TVING/GO-SOPT-TVING/Info.plist | 30 + GO-SOPT-TVING/GO-SOPT-TVING/LoginView.swift | 252 +++++++++ .../GO-SOPT-TVING/LoginViewController.swift | 108 ++++ .../GO-SOPT-TVING/SceneDelegate.swift | 25 + .../GO-SOPT-TVING/ViewController.swift | 20 + .../GO-SOPT-TVING/WelcomeViewController.swift | 87 +++ 21 files changed, 1357 insertions(+) create mode 100644 GO-SOPT-TVING/GO-SOPT-TVING.xcodeproj/project.pbxproj create mode 100644 GO-SOPT-TVING/GO-SOPT-TVING.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 GO-SOPT-TVING/GO-SOPT-TVING.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 GO-SOPT-TVING/GO-SOPT-TVING.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved create mode 100644 GO-SOPT-TVING/GO-SOPT-TVING/AppDelegate.swift create mode 100644 GO-SOPT-TVING/GO-SOPT-TVING/Assets.xcassets/AccentColor.colorset/Contents.json create mode 100644 GO-SOPT-TVING/GO-SOPT-TVING/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 GO-SOPT-TVING/GO-SOPT-TVING/Assets.xcassets/Contents.json create mode 100644 GO-SOPT-TVING/GO-SOPT-TVING/Base.lproj/LaunchScreen.storyboard create mode 100644 GO-SOPT-TVING/GO-SOPT-TVING/Base.lproj/Main.storyboard create mode 100644 GO-SOPT-TVING/GO-SOPT-TVING/Extension/UIButton+.swift create mode 100644 GO-SOPT-TVING/GO-SOPT-TVING/Extension/UIColor+.swift create mode 100644 GO-SOPT-TVING/GO-SOPT-TVING/Extension/UIFont+.swift create mode 100644 GO-SOPT-TVING/GO-SOPT-TVING/Extension/UITextField+.swift create mode 100644 GO-SOPT-TVING/GO-SOPT-TVING/Extension/UIView+.swift create mode 100644 GO-SOPT-TVING/GO-SOPT-TVING/Info.plist create mode 100644 GO-SOPT-TVING/GO-SOPT-TVING/LoginView.swift create mode 100644 GO-SOPT-TVING/GO-SOPT-TVING/LoginViewController.swift create mode 100644 GO-SOPT-TVING/GO-SOPT-TVING/SceneDelegate.swift create mode 100644 GO-SOPT-TVING/GO-SOPT-TVING/ViewController.swift create mode 100644 GO-SOPT-TVING/GO-SOPT-TVING/WelcomeViewController.swift diff --git a/GO-SOPT-TVING/GO-SOPT-TVING.xcodeproj/project.pbxproj b/GO-SOPT-TVING/GO-SOPT-TVING.xcodeproj/project.pbxproj new file mode 100644 index 0000000..38ca177 --- /dev/null +++ b/GO-SOPT-TVING/GO-SOPT-TVING.xcodeproj/project.pbxproj @@ -0,0 +1,512 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 56; + objects = { + +/* Begin PBXBuildFile section */ + 7E60ADC229F1532B00C4D119 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7E60ADC129F1532B00C4D119 /* AppDelegate.swift */; }; + 7E60ADC429F1532B00C4D119 /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7E60ADC329F1532B00C4D119 /* SceneDelegate.swift */; }; + 7E60ADC629F1532B00C4D119 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7E60ADC529F1532B00C4D119 /* ViewController.swift */; }; + 7E60ADCB29F1532D00C4D119 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 7E60ADCA29F1532D00C4D119 /* Assets.xcassets */; }; + 7E60ADCE29F1532D00C4D119 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 7E60ADCC29F1532D00C4D119 /* LaunchScreen.storyboard */; }; + 7E60ADD729F1544200C4D119 /* Inject in Frameworks */ = {isa = PBXBuildFile; productRef = 7E60ADD629F1544200C4D119 /* Inject */; }; + 7E60ADDA29F1553100C4D119 /* SnapKit in Frameworks */ = {isa = PBXBuildFile; productRef = 7E60ADD929F1553100C4D119 /* SnapKit */; }; + 7E60ADDD29F1554D00C4D119 /* Then in Frameworks */ = {isa = PBXBuildFile; productRef = 7E60ADDC29F1554D00C4D119 /* Then */; }; + 7E60ADE629F1585400C4D119 /* Pretendard-SemiBold.otf in Resources */ = {isa = PBXBuildFile; fileRef = 7E60ADE129F1585400C4D119 /* Pretendard-SemiBold.otf */; }; + 7E60ADE729F1585400C4D119 /* Pretendard-Bold.otf in Resources */ = {isa = PBXBuildFile; fileRef = 7E60ADE229F1585400C4D119 /* Pretendard-Bold.otf */; }; + 7E60ADE829F1585400C4D119 /* Pretendard-Medium.otf in Resources */ = {isa = PBXBuildFile; fileRef = 7E60ADE329F1585400C4D119 /* Pretendard-Medium.otf */; }; + 7E60ADE929F1585400C4D119 /* Pretendard-Regular.otf in Resources */ = {isa = PBXBuildFile; fileRef = 7E60ADE429F1585400C4D119 /* Pretendard-Regular.otf */; }; + 7E60ADEC29F15E4F00C4D119 /* UIFont+.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7E60ADEB29F15E4F00C4D119 /* UIFont+.swift */; }; + 7E60ADFD29F1A8BF00C4D119 /* tving-logo.png in Resources */ = {isa = PBXBuildFile; fileRef = 7E60ADF829F1A8BF00C4D119 /* tving-logo.png */; }; + 7E60ADFE29F1A8BF00C4D119 /* eye-slash.png in Resources */ = {isa = PBXBuildFile; fileRef = 7E60ADF929F1A8BF00C4D119 /* eye-slash.png */; }; + 7E60ADFF29F1A8BF00C4D119 /* eye.png in Resources */ = {isa = PBXBuildFile; fileRef = 7E60ADFA29F1A8BF00C4D119 /* eye.png */; }; + 7E60AE0029F1A8BF00C4D119 /* btn_before.png in Resources */ = {isa = PBXBuildFile; fileRef = 7E60ADFB29F1A8BF00C4D119 /* btn_before.png */; }; + 7E60AE0129F1A8BF00C4D119 /* x-circle.png in Resources */ = {isa = PBXBuildFile; fileRef = 7E60ADFC29F1A8BF00C4D119 /* x-circle.png */; }; + 7E60AE0329F1AC1300C4D119 /* LoginViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7E60AE0229F1AC1300C4D119 /* LoginViewController.swift */; }; + 7E60AE0529F1B08A00C4D119 /* LoginView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7E60AE0429F1B08A00C4D119 /* LoginView.swift */; }; + 7E60AE0729F1BB6500C4D119 /* UIColor+.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7E60AE0629F1BB6500C4D119 /* UIColor+.swift */; }; + 7E60AE0929F1C49200C4D119 /* UITextField+.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7E60AE0829F1C49200C4D119 /* UITextField+.swift */; }; + 7E60AE0B29F1E37600C4D119 /* UIButton+.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7E60AE0A29F1E37600C4D119 /* UIButton+.swift */; }; + 7E60AE0D29F204F500C4D119 /* UIView+.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7E60AE0C29F204F500C4D119 /* UIView+.swift */; }; + 7E60AE0F29F20D8700C4D119 /* WelcomeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7E60AE0E29F20D8600C4D119 /* WelcomeViewController.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 7E60ADBE29F1532B00C4D119 /* GO-SOPT-TVING.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "GO-SOPT-TVING.app"; sourceTree = BUILT_PRODUCTS_DIR; }; + 7E60ADC129F1532B00C4D119 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 7E60ADC329F1532B00C4D119 /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = ""; }; + 7E60ADC529F1532B00C4D119 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; + 7E60ADCA29F1532D00C4D119 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 7E60ADCD29F1532D00C4D119 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 7E60ADCF29F1532D00C4D119 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 7E60ADE129F1585400C4D119 /* Pretendard-SemiBold.otf */ = {isa = PBXFileReference; lastKnownFileType = file; name = "Pretendard-SemiBold.otf"; path = "../../../../../../Downloads/Pretendard-1.2.1/public/static/Pretendard-SemiBold.otf"; sourceTree = ""; }; + 7E60ADE229F1585400C4D119 /* Pretendard-Bold.otf */ = {isa = PBXFileReference; lastKnownFileType = file; name = "Pretendard-Bold.otf"; path = "../../../../../../Downloads/Pretendard-1.2.1/public/static/Pretendard-Bold.otf"; sourceTree = ""; }; + 7E60ADE329F1585400C4D119 /* Pretendard-Medium.otf */ = {isa = PBXFileReference; lastKnownFileType = file; name = "Pretendard-Medium.otf"; path = "../../../../../../Downloads/Pretendard-1.2.1/public/static/Pretendard-Medium.otf"; sourceTree = ""; }; + 7E60ADE429F1585400C4D119 /* Pretendard-Regular.otf */ = {isa = PBXFileReference; lastKnownFileType = file; name = "Pretendard-Regular.otf"; path = "../../../../../../Downloads/Pretendard-1.2.1/public/static/Pretendard-Regular.otf"; sourceTree = ""; }; + 7E60ADEB29F15E4F00C4D119 /* UIFont+.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIFont+.swift"; sourceTree = ""; }; + 7E60ADF829F1A8BF00C4D119 /* tving-logo.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "tving-logo.png"; path = "../../../../../TVING-Resources/tving-logo.png"; sourceTree = ""; }; + 7E60ADF929F1A8BF00C4D119 /* eye-slash.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "eye-slash.png"; path = "../../../../../TVING-Resources/eye-slash.png"; sourceTree = ""; }; + 7E60ADFA29F1A8BF00C4D119 /* eye.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = eye.png; path = "../../../../../TVING-Resources/eye.png"; sourceTree = ""; }; + 7E60ADFB29F1A8BF00C4D119 /* btn_before.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = btn_before.png; path = "../../../../../TVING-Resources/btn_before.png"; sourceTree = ""; }; + 7E60ADFC29F1A8BF00C4D119 /* x-circle.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "x-circle.png"; path = "../../../../../TVING-Resources/x-circle.png"; sourceTree = ""; }; + 7E60AE0229F1AC1300C4D119 /* LoginViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoginViewController.swift; sourceTree = ""; }; + 7E60AE0429F1B08A00C4D119 /* LoginView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoginView.swift; sourceTree = ""; }; + 7E60AE0629F1BB6500C4D119 /* UIColor+.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIColor+.swift"; sourceTree = ""; }; + 7E60AE0829F1C49200C4D119 /* UITextField+.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UITextField+.swift"; sourceTree = ""; }; + 7E60AE0A29F1E37600C4D119 /* UIButton+.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIButton+.swift"; sourceTree = ""; }; + 7E60AE0C29F204F500C4D119 /* UIView+.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIView+.swift"; sourceTree = ""; }; + 7E60AE0E29F20D8600C4D119 /* WelcomeViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WelcomeViewController.swift; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 7E60ADBB29F1532B00C4D119 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 7E60ADD729F1544200C4D119 /* Inject in Frameworks */, + 7E60ADDD29F1554D00C4D119 /* Then in Frameworks */, + 7E60ADDA29F1553100C4D119 /* SnapKit in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 7E60ADB529F1532B00C4D119 = { + isa = PBXGroup; + children = ( + 7E60ADC029F1532B00C4D119 /* GO-SOPT-TVING */, + 7E60ADBF29F1532B00C4D119 /* Products */, + ); + sourceTree = ""; + }; + 7E60ADBF29F1532B00C4D119 /* Products */ = { + isa = PBXGroup; + children = ( + 7E60ADBE29F1532B00C4D119 /* GO-SOPT-TVING.app */, + ); + name = Products; + sourceTree = ""; + }; + 7E60ADC029F1532B00C4D119 /* GO-SOPT-TVING */ = { + isa = PBXGroup; + children = ( + 7E60ADEA29F15E2500C4D119 /* Extension */, + 7E60ADDE29F1577700C4D119 /* Resources */, + 7E60AE0229F1AC1300C4D119 /* LoginViewController.swift */, + 7E60AE0E29F20D8600C4D119 /* WelcomeViewController.swift */, + 7E60ADC129F1532B00C4D119 /* AppDelegate.swift */, + 7E60ADC329F1532B00C4D119 /* SceneDelegate.swift */, + 7E60ADC529F1532B00C4D119 /* ViewController.swift */, + 7E60ADCA29F1532D00C4D119 /* Assets.xcassets */, + 7E60ADCC29F1532D00C4D119 /* LaunchScreen.storyboard */, + 7E60ADCF29F1532D00C4D119 /* Info.plist */, + 7E60AE0429F1B08A00C4D119 /* LoginView.swift */, + ); + path = "GO-SOPT-TVING"; + sourceTree = ""; + }; + 7E60ADDE29F1577700C4D119 /* Resources */ = { + isa = PBXGroup; + children = ( + 7E60ADF729F1A89900C4D119 /* Image */, + 7E60ADDF29F1579C00C4D119 /* Font */, + ); + path = Resources; + sourceTree = ""; + }; + 7E60ADDF29F1579C00C4D119 /* Font */ = { + isa = PBXGroup; + children = ( + 7E60ADE229F1585400C4D119 /* Pretendard-Bold.otf */, + 7E60ADE329F1585400C4D119 /* Pretendard-Medium.otf */, + 7E60ADE429F1585400C4D119 /* Pretendard-Regular.otf */, + 7E60ADE129F1585400C4D119 /* Pretendard-SemiBold.otf */, + ); + path = Font; + sourceTree = ""; + }; + 7E60ADEA29F15E2500C4D119 /* Extension */ = { + isa = PBXGroup; + children = ( + 7E60ADEB29F15E4F00C4D119 /* UIFont+.swift */, + 7E60AE0629F1BB6500C4D119 /* UIColor+.swift */, + 7E60AE0829F1C49200C4D119 /* UITextField+.swift */, + 7E60AE0A29F1E37600C4D119 /* UIButton+.swift */, + 7E60AE0C29F204F500C4D119 /* UIView+.swift */, + ); + path = Extension; + sourceTree = ""; + }; + 7E60ADF729F1A89900C4D119 /* Image */ = { + isa = PBXGroup; + children = ( + 7E60ADFB29F1A8BF00C4D119 /* btn_before.png */, + 7E60ADF929F1A8BF00C4D119 /* eye-slash.png */, + 7E60ADFA29F1A8BF00C4D119 /* eye.png */, + 7E60ADF829F1A8BF00C4D119 /* tving-logo.png */, + 7E60ADFC29F1A8BF00C4D119 /* x-circle.png */, + ); + path = Image; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 7E60ADBD29F1532B00C4D119 /* GO-SOPT-TVING */ = { + isa = PBXNativeTarget; + buildConfigurationList = 7E60ADD229F1532D00C4D119 /* Build configuration list for PBXNativeTarget "GO-SOPT-TVING" */; + buildPhases = ( + 7E60ADBA29F1532B00C4D119 /* Sources */, + 7E60ADBB29F1532B00C4D119 /* Frameworks */, + 7E60ADBC29F1532B00C4D119 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "GO-SOPT-TVING"; + packageProductDependencies = ( + 7E60ADD629F1544200C4D119 /* Inject */, + 7E60ADD929F1553100C4D119 /* SnapKit */, + 7E60ADDC29F1554D00C4D119 /* Then */, + ); + productName = "GO-SOPT-TVING"; + productReference = 7E60ADBE29F1532B00C4D119 /* GO-SOPT-TVING.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 7E60ADB629F1532B00C4D119 /* Project object */ = { + isa = PBXProject; + attributes = { + BuildIndependentTargetsInParallel = 1; + LastSwiftUpdateCheck = 1430; + LastUpgradeCheck = 1430; + TargetAttributes = { + 7E60ADBD29F1532B00C4D119 = { + CreatedOnToolsVersion = 14.3; + }; + }; + }; + buildConfigurationList = 7E60ADB929F1532B00C4D119 /* Build configuration list for PBXProject "GO-SOPT-TVING" */; + compatibilityVersion = "Xcode 14.0"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 7E60ADB529F1532B00C4D119; + packageReferences = ( + 7E60ADD529F1544200C4D119 /* XCRemoteSwiftPackageReference "Inject" */, + 7E60ADD829F1553100C4D119 /* XCRemoteSwiftPackageReference "SnapKit" */, + 7E60ADDB29F1554D00C4D119 /* XCRemoteSwiftPackageReference "Then" */, + ); + productRefGroup = 7E60ADBF29F1532B00C4D119 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 7E60ADBD29F1532B00C4D119 /* GO-SOPT-TVING */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 7E60ADBC29F1532B00C4D119 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 7E60ADE829F1585400C4D119 /* Pretendard-Medium.otf in Resources */, + 7E60ADFE29F1A8BF00C4D119 /* eye-slash.png in Resources */, + 7E60ADCE29F1532D00C4D119 /* LaunchScreen.storyboard in Resources */, + 7E60AE0029F1A8BF00C4D119 /* btn_before.png in Resources */, + 7E60ADE729F1585400C4D119 /* Pretendard-Bold.otf in Resources */, + 7E60ADFD29F1A8BF00C4D119 /* tving-logo.png in Resources */, + 7E60ADFF29F1A8BF00C4D119 /* eye.png in Resources */, + 7E60AE0129F1A8BF00C4D119 /* x-circle.png in Resources */, + 7E60ADE629F1585400C4D119 /* Pretendard-SemiBold.otf in Resources */, + 7E60ADE929F1585400C4D119 /* Pretendard-Regular.otf in Resources */, + 7E60ADCB29F1532D00C4D119 /* Assets.xcassets in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 7E60ADBA29F1532B00C4D119 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 7E60AE0529F1B08A00C4D119 /* LoginView.swift in Sources */, + 7E60ADEC29F15E4F00C4D119 /* UIFont+.swift in Sources */, + 7E60AE0F29F20D8700C4D119 /* WelcomeViewController.swift in Sources */, + 7E60ADC629F1532B00C4D119 /* ViewController.swift in Sources */, + 7E60ADC229F1532B00C4D119 /* AppDelegate.swift in Sources */, + 7E60AE0D29F204F500C4D119 /* UIView+.swift in Sources */, + 7E60AE0B29F1E37600C4D119 /* UIButton+.swift in Sources */, + 7E60AE0329F1AC1300C4D119 /* LoginViewController.swift in Sources */, + 7E60ADC429F1532B00C4D119 /* SceneDelegate.swift in Sources */, + 7E60AE0729F1BB6500C4D119 /* UIColor+.swift in Sources */, + 7E60AE0929F1C49200C4D119 /* UITextField+.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + 7E60ADCC29F1532D00C4D119 /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 7E60ADCD29F1532D00C4D119 /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 7E60ADD029F1532D00C4D119 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 16.4; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 7E60ADD129F1532D00C4D119 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 16.4; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + SDKROOT = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 7E60ADD329F1532D00C4D119 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = 77GRA593GT; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = "GO-SOPT-TVING/Info.plist"; + INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; + INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + OTHER_LDFLAGS = "-Xlinker-interposable"; + PRODUCT_BUNDLE_IDENTIFIER = "sarangkim.GO-SOPT-TVING"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 7E60ADD429F1532D00C4D119 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = 77GRA593GT; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = "GO-SOPT-TVING/Info.plist"; + INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; + INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + OTHER_LDFLAGS = "-Xlinker-interposable"; + PRODUCT_BUNDLE_IDENTIFIER = "sarangkim.GO-SOPT-TVING"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 7E60ADB929F1532B00C4D119 /* Build configuration list for PBXProject "GO-SOPT-TVING" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 7E60ADD029F1532D00C4D119 /* Debug */, + 7E60ADD129F1532D00C4D119 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 7E60ADD229F1532D00C4D119 /* Build configuration list for PBXNativeTarget "GO-SOPT-TVING" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 7E60ADD329F1532D00C4D119 /* Debug */, + 7E60ADD429F1532D00C4D119 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + +/* Begin XCRemoteSwiftPackageReference section */ + 7E60ADD529F1544200C4D119 /* XCRemoteSwiftPackageReference "Inject" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/krzysztofzablocki/Inject.git"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 1.0.0; + }; + }; + 7E60ADD829F1553100C4D119 /* XCRemoteSwiftPackageReference "SnapKit" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/SnapKit/SnapKit.git"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 5.0.0; + }; + }; + 7E60ADDB29F1554D00C4D119 /* XCRemoteSwiftPackageReference "Then" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/devxoul/Then.git"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 3.0.0; + }; + }; +/* End XCRemoteSwiftPackageReference section */ + +/* Begin XCSwiftPackageProductDependency section */ + 7E60ADD629F1544200C4D119 /* Inject */ = { + isa = XCSwiftPackageProductDependency; + package = 7E60ADD529F1544200C4D119 /* XCRemoteSwiftPackageReference "Inject" */; + productName = Inject; + }; + 7E60ADD929F1553100C4D119 /* SnapKit */ = { + isa = XCSwiftPackageProductDependency; + package = 7E60ADD829F1553100C4D119 /* XCRemoteSwiftPackageReference "SnapKit" */; + productName = SnapKit; + }; + 7E60ADDC29F1554D00C4D119 /* Then */ = { + isa = XCSwiftPackageProductDependency; + package = 7E60ADDB29F1554D00C4D119 /* XCRemoteSwiftPackageReference "Then" */; + productName = Then; + }; +/* End XCSwiftPackageProductDependency section */ + }; + rootObject = 7E60ADB629F1532B00C4D119 /* Project object */; +} diff --git a/GO-SOPT-TVING/GO-SOPT-TVING.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/GO-SOPT-TVING/GO-SOPT-TVING.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..919434a --- /dev/null +++ b/GO-SOPT-TVING/GO-SOPT-TVING.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/GO-SOPT-TVING/GO-SOPT-TVING.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/GO-SOPT-TVING/GO-SOPT-TVING.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/GO-SOPT-TVING/GO-SOPT-TVING.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/GO-SOPT-TVING/GO-SOPT-TVING.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/GO-SOPT-TVING/GO-SOPT-TVING.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved new file mode 100644 index 0000000..ecf98a9 --- /dev/null +++ b/GO-SOPT-TVING/GO-SOPT-TVING.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -0,0 +1,32 @@ +{ + "pins" : [ + { + "identity" : "inject", + "kind" : "remoteSourceControl", + "location" : "https://github.com/krzysztofzablocki/Inject.git", + "state" : { + "revision" : "abcc4b091fd384cfd09b149a60298b75dc87c5b9", + "version" : "1.2.3" + } + }, + { + "identity" : "snapkit", + "kind" : "remoteSourceControl", + "location" : "https://github.com/SnapKit/SnapKit.git", + "state" : { + "revision" : "f222cbdf325885926566172f6f5f06af95473158", + "version" : "5.6.0" + } + }, + { + "identity" : "then", + "kind" : "remoteSourceControl", + "location" : "https://github.com/devxoul/Then.git", + "state" : { + "revision" : "d41ef523faef0f911369f79c0b96815d9dbb6d7a", + "version" : "3.0.0" + } + } + ], + "version" : 2 +} diff --git a/GO-SOPT-TVING/GO-SOPT-TVING/AppDelegate.swift b/GO-SOPT-TVING/GO-SOPT-TVING/AppDelegate.swift new file mode 100644 index 0000000..01b60ce --- /dev/null +++ b/GO-SOPT-TVING/GO-SOPT-TVING/AppDelegate.swift @@ -0,0 +1,36 @@ +// +// AppDelegate.swift +// GO-SOPT-TVING +// +// Created by 김사랑 on 2023/04/20. +// + +import UIKit + +@main +class AppDelegate: UIResponder, UIApplicationDelegate { + + + + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { + // Override point for customization after application launch. + return true + } + + // MARK: UISceneSession Lifecycle + + func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration { + // Called when a new scene session is being created. + // Use this method to select a configuration to create the new scene with. + return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role) + } + + func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set) { + // Called when the user discards a scene session. + // If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions. + // Use this method to release any resources that were specific to the discarded scenes, as they will not return. + } + + +} + diff --git a/GO-SOPT-TVING/GO-SOPT-TVING/Assets.xcassets/AccentColor.colorset/Contents.json b/GO-SOPT-TVING/GO-SOPT-TVING/Assets.xcassets/AccentColor.colorset/Contents.json new file mode 100644 index 0000000..eb87897 --- /dev/null +++ b/GO-SOPT-TVING/GO-SOPT-TVING/Assets.xcassets/AccentColor.colorset/Contents.json @@ -0,0 +1,11 @@ +{ + "colors" : [ + { + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/GO-SOPT-TVING/GO-SOPT-TVING/Assets.xcassets/AppIcon.appiconset/Contents.json b/GO-SOPT-TVING/GO-SOPT-TVING/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..13613e3 --- /dev/null +++ b/GO-SOPT-TVING/GO-SOPT-TVING/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,13 @@ +{ + "images" : [ + { + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/GO-SOPT-TVING/GO-SOPT-TVING/Assets.xcassets/Contents.json b/GO-SOPT-TVING/GO-SOPT-TVING/Assets.xcassets/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/GO-SOPT-TVING/GO-SOPT-TVING/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/GO-SOPT-TVING/GO-SOPT-TVING/Base.lproj/LaunchScreen.storyboard b/GO-SOPT-TVING/GO-SOPT-TVING/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 0000000..865e932 --- /dev/null +++ b/GO-SOPT-TVING/GO-SOPT-TVING/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/GO-SOPT-TVING/GO-SOPT-TVING/Base.lproj/Main.storyboard b/GO-SOPT-TVING/GO-SOPT-TVING/Base.lproj/Main.storyboard new file mode 100644 index 0000000..25a7638 --- /dev/null +++ b/GO-SOPT-TVING/GO-SOPT-TVING/Base.lproj/Main.storyboard @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/GO-SOPT-TVING/GO-SOPT-TVING/Extension/UIButton+.swift b/GO-SOPT-TVING/GO-SOPT-TVING/Extension/UIButton+.swift new file mode 100644 index 0000000..07448f4 --- /dev/null +++ b/GO-SOPT-TVING/GO-SOPT-TVING/Extension/UIButton+.swift @@ -0,0 +1,22 @@ +// +// UIButton+.swift +// GO-SOPT-TVING +// +// Created by 김사랑 on 2023/04/21. +// + +import UIKit + +extension UIButton { + + func setUnderline() { + guard let title = title(for: .normal) else { return } + let attributedString = NSMutableAttributedString(string: title) + attributedString.addAttribute(.underlineStyle, + value: NSUnderlineStyle.single.rawValue, + range: NSRange(location: 0, length: title.count) + ) + setAttributedTitle(attributedString, for: .normal) + } + +} diff --git a/GO-SOPT-TVING/GO-SOPT-TVING/Extension/UIColor+.swift b/GO-SOPT-TVING/GO-SOPT-TVING/Extension/UIColor+.swift new file mode 100644 index 0000000..029b84c --- /dev/null +++ b/GO-SOPT-TVING/GO-SOPT-TVING/Extension/UIColor+.swift @@ -0,0 +1,54 @@ +// +// UIColor+.swift +// GO-SOPT-TVING +// +// Created by 김사랑 on 2023/04/21. +// + +import UIKit + +extension UIColor { + convenience init(hex: String, alpha: CGFloat = 1.0) { + var hexString: String = hex.trimmingCharacters(in: .whitespacesAndNewlines).uppercased() + + if hexString.hasPrefix("#") { + hexString.remove(at: hexString.startIndex) + } + + if hexString.count != 6 { + self.init(red: 0, green: 0, blue: 0, alpha: alpha) + return + } + + guard let rgbValue = UInt64(hexString, radix: 16) else { + self.init(red: 0, green: 0, blue: 0, alpha: alpha) + return + } + + self.init(red: CGFloat((rgbValue & 0xFF0000) >> 16) / 255.0, + green: CGFloat((rgbValue & 0x00FF00) >> 8) / 255.0, + blue: CGFloat(rgbValue & 0x0000FF) / 255.0, + alpha: alpha) + } +} + +extension UIColor { + + class var mainRed: UIColor { + return UIColor(hex: "FF143C") + } + + class var textGrey4: UIColor { + return UIColor(hex: "2E2E2E") + } + class var textGrey3: UIColor { + return UIColor(hex: "626262") + } + class var textGrey2: UIColor { + return UIColor(hex: "9C9C9C") + } + class var textGrey1: UIColor { + return UIColor(hex: "D6D6D6") + } + +} diff --git a/GO-SOPT-TVING/GO-SOPT-TVING/Extension/UIFont+.swift b/GO-SOPT-TVING/GO-SOPT-TVING/Extension/UIFont+.swift new file mode 100644 index 0000000..18bf32e --- /dev/null +++ b/GO-SOPT-TVING/GO-SOPT-TVING/Extension/UIFont+.swift @@ -0,0 +1,34 @@ +// +// UIFont+.swift +// GO-SOPT-TVING +// +// Created by 김사랑 on 2023/04/20. +// + +import UIKit + +extension UIFont { + + class func tvingRegular(ofSize size: CGFloat) -> UIFont{ + return UIFont(name: "Pretendard-Regular", size: size)! + } + + class func tvingMedium(ofSize size: CGFloat) -> UIFont{ + return UIFont(name: "Pretendard-Medium", size: size)! + } + + class func tvingSemiBold(ofSize size: CGFloat) -> UIFont{ + return UIFont(name: "Pretendard-SemiBold", size: size)! + } + + class func tvingBold(ofSize size: CGFloat) -> UIFont{ + return UIFont(name: "Pretendard-Bold", size: size)! + } +} + + +//#사용시 +//private lazy var startButton = UIButton().then { +// $0.setTitle("티빙", for: .normal) +// $0.titleLabel?.font = .tvingSemiBold(ofSize: 18) +// } diff --git a/GO-SOPT-TVING/GO-SOPT-TVING/Extension/UITextField+.swift b/GO-SOPT-TVING/GO-SOPT-TVING/Extension/UITextField+.swift new file mode 100644 index 0000000..28d902b --- /dev/null +++ b/GO-SOPT-TVING/GO-SOPT-TVING/Extension/UITextField+.swift @@ -0,0 +1,37 @@ +// +// UITextField+.swift +// GO-SOPT-TVING +// +// Created by 김사랑 on 2023/04/21. +// + +import UIKit + +extension UITextField { + //텍스트필드 터치 시 테두리 컬러 변경 + func setPlaceholderColor(_ placeholderColor: UIColor) { + attributedPlaceholder = NSAttributedString( + string: placeholder ?? "", + attributes: [ + .foregroundColor: placeholderColor, + .font: font + ].compactMapValues { $0 } + ) + } + + + func setLeftPaddingPoints(_ amount:CGFloat){ //왼쪽에 여백 주기 + let paddingView = UIView(frame: CGRect(x: 0, y: 0, width: amount, height: self.frame.size.height)) + self.leftView = paddingView + self.leftViewMode = .always + } + + func setRightPaddingPoints(_ amount:CGFloat) { //오른쪽에 여백 주기 + let paddingView = UIView(frame: CGRect(x: 0, y: 0, width: amount, height: self.frame.size.height)) + self.rightView = paddingView + self.rightViewMode = .always + } + + +} + diff --git a/GO-SOPT-TVING/GO-SOPT-TVING/Extension/UIView+.swift b/GO-SOPT-TVING/GO-SOPT-TVING/Extension/UIView+.swift new file mode 100644 index 0000000..5cbe1c4 --- /dev/null +++ b/GO-SOPT-TVING/GO-SOPT-TVING/Extension/UIView+.swift @@ -0,0 +1,14 @@ +// +// UIView+.swift +// GO-SOPT-TVING +// +// Created by 김사랑 on 2023/04/21. +// + +import UIKit + +extension UIView { + func addSubviews(_ views: UIView...) { + views.forEach { self.addSubview($0) } + } +} diff --git a/GO-SOPT-TVING/GO-SOPT-TVING/Info.plist b/GO-SOPT-TVING/GO-SOPT-TVING/Info.plist new file mode 100644 index 0000000..0334743 --- /dev/null +++ b/GO-SOPT-TVING/GO-SOPT-TVING/Info.plist @@ -0,0 +1,30 @@ + + + + + UIAppFonts + + Pretendard-Regular.otf + Pretendard-Medium.otf + Pretendard-SemiBold.otf + Pretendard-Bold.otf + + UIApplicationSceneManifest + + UIApplicationSupportsMultipleScenes + + UISceneConfigurations + + UIWindowSceneSessionRoleApplication + + + UISceneConfigurationName + Default Configuration + UISceneDelegateClassName + $(PRODUCT_MODULE_NAME).SceneDelegate + + + + + + diff --git a/GO-SOPT-TVING/GO-SOPT-TVING/LoginView.swift b/GO-SOPT-TVING/GO-SOPT-TVING/LoginView.swift new file mode 100644 index 0000000..28971bd --- /dev/null +++ b/GO-SOPT-TVING/GO-SOPT-TVING/LoginView.swift @@ -0,0 +1,252 @@ +// +// LoginView.swift +// GO-SOPT-TVING +// +// Created by 김사랑 on 2023/04/21. +// + +import UIKit + +class LoginView: UIView { + + private lazy var backButton = UIButton().then { + $0.setImage(UIImage(named: "btn_before"), for: .normal) + } + + private let loginLabel = UILabel().then { + $0.text = "TVING ID 로그인" + $0.font = .tvingMedium(ofSize: 23) + $0.textColor = .textGrey1 + $0.textAlignment = .center + } + + public let idTextField = UITextField().then { + $0.placeholder = "아이디" + $0.font = .tvingSemiBold(ofSize: 15) + $0.textColor = .textGrey2 + $0.backgroundColor = .textGrey4 + $0.keyboardType = .default + if let clearButton = $0.value(forKeyPath: "_clearButton") as? UIButton { + clearButton.setImage(UIImage(named: "x-circle"), for: .normal) + } + $0.clearButtonMode = UITextField.ViewMode.whileEditing + $0.setLeftPaddingPoints(22) + $0.layer.cornerRadius = 3 + $0.autocapitalizationType = .none + $0.setPlaceholderColor(.textGrey2) + } + + public let passwordTextField = UITextField().then { + $0.placeholder = "비밀번호" + $0.font = .tvingSemiBold(ofSize: 15) + $0.textColor = .textGrey2 + $0.backgroundColor = .textGrey4 + $0.keyboardType = .default + + //Clear Button 이미지 변경 + if let clearButton = $0.value(forKeyPath: "_clearButton") as? UIButton { + clearButton.setImage(UIImage(named: "x-circle"), for: .normal) + } + //텍스트필드에 글자를 쓰고 있을때 클리어 버튼이 나타나도록 + $0.clearButtonMode = UITextField.ViewMode.whileEditing + + $0.setLeftPaddingPoints(22) + $0.layer.cornerRadius = 3 + $0.autocapitalizationType = .none + $0.setPlaceholderColor(.textGrey2) + $0.isSecureTextEntry = true + } + + public lazy var loginButton = UIButton().then { + $0.setTitle("로그인하기", for: .normal) + $0.titleLabel?.font = .tvingSemiBold(ofSize: 14) + $0.setTitleColor(.textGrey2, for: .normal) + $0.backgroundColor = .black + $0.layer.borderWidth = 1 + $0.layer.borderColor = UIColor.textGrey4.cgColor + $0.titleLabel?.textAlignment = .center + $0.layer.cornerRadius = 3 + + } + + public lazy var findIDButton = UIButton().then { + $0.setTitle("아이디 찾기", for: .normal) + $0.titleLabel?.font = .tvingSemiBold(ofSize: 14) + $0.setTitleColor(.textGrey2, for: .normal) + $0.titleLabel?.textAlignment = .center + } + + private let separator = UIView().then { + $0.backgroundColor = .textGrey4 + } + + public lazy var findPWButton = UIButton().then { + $0.setTitle("비밀번호 찾기", for: .normal) + $0.titleLabel?.font = .tvingSemiBold(ofSize: 14) + $0.setTitleColor(.textGrey2, for: .normal) + $0.titleLabel?.textAlignment = .center + } + + private let existAccountLabel = UILabel().then { + $0.text = "아직 계정이 없으신가요?" + $0.font = .tvingSemiBold(ofSize: 14) + $0.textColor = .textGrey3 + $0.textAlignment = .center + } + + public lazy var makeNicknameButton = UIButton().then { + $0.setTitle("닉네임 만들러가기", for: .normal) + $0.titleLabel?.font = .tvingRegular(ofSize: 14) + $0.setTitleColor(.textGrey2, for: .normal) + $0.titleLabel?.textAlignment = .center + $0.setUnderline() + } + + public lazy var clearIDButton = UIButton().then { + $0.setImage(UIImage(named: "x-circle"), for: .normal) + $0.isEnabled = false + $0.isHidden = true +// $0.addTarget(self, action: #selector(self.clearTextField), for: .touchUpInside) + } + + public lazy var clearPWButton = UIButton().then { + $0.setImage(UIImage(named: "x-circle"), for: .normal) + $0.isEnabled = false + $0.isHidden = true +// $0.addTarget(self, action: #selector(self.clearTextField), for: .touchUpInside) + } + + public lazy var securityButton = UIButton().then { + $0.setImage(UIImage(named: "eye-slash"), for: .normal) + $0.isEnabled = false + $0.isUserInteractionEnabled = true + $0.isHidden = true + } + + override init(frame: CGRect) { + super.init(frame: frame) + + style() + setLayout() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + +} + +private extension LoginView { + + func style() { + self.backgroundColor = .black + } + + func setLayout() { + [backButton, + loginLabel, + idTextField, + passwordTextField, + loginButton, + findIDButton, + separator, + findPWButton, + existAccountLabel, + makeNicknameButton, + clearIDButton, + clearPWButton, + securityButton].forEach { + self.addSubview($0) + } + + backButton.snp.makeConstraints{ + $0.height.equalTo(15) + $0.width.equalTo(8) + $0.top.equalToSuperview().offset(69) + $0.leading.equalToSuperview().offset(24) + } + + loginLabel.snp.makeConstraints{ + $0.height.equalTo(37) + $0.top.equalTo(backButton.snp.bottom).offset(10) + $0.centerX.equalToSuperview() + } + + + idTextField.snp.makeConstraints{ + $0.height.equalTo(52) + $0.top.equalTo(loginLabel.snp.bottom).offset(31) + $0.leading.trailing.equalToSuperview().inset(20) + } + + passwordTextField.snp.makeConstraints{ + $0.height.equalTo(52) + $0.top.equalTo(idTextField.snp.bottom).offset(7) + $0.leading.trailing.equalToSuperview().inset(20) + } + + loginButton.snp.makeConstraints{ + $0.height.equalTo(52) + $0.top.equalTo(passwordTextField.snp.bottom).offset(21) + $0.leading.trailing.equalToSuperview().inset(20) + } + + findIDButton.snp.makeConstraints{ +// $0.width.equalTo(62) + $0.height.equalTo(22) + $0.top.equalTo(loginButton.snp.bottom).offset(31) + $0.leading.equalToSuperview().inset(85) + } + + separator.snp.makeConstraints{ + $0.height.equalTo(12) + $0.width.equalTo(1) + $0.top.equalTo(loginButton.snp.bottom).offset(36) + $0.leading.equalTo(180) +// $0.trailing.equalTo(195) + } + + findPWButton.snp.makeConstraints{ +// $0.width.equalTo(73) + $0.height.equalTo(22) + $0.top.equalTo(loginButton.snp.bottom).offset(31) + $0.trailing.equalToSuperview().inset(86) + } + + existAccountLabel.snp.makeConstraints{ +// $0.width.equalTo(129) + $0.height.equalTo(22) + $0.top.equalTo(findIDButton.snp.bottom).offset(28) + $0.leading.equalToSuperview().inset(51) + } + + makeNicknameButton.snp.makeConstraints{ + $0.width.equalTo(128) + $0.height.equalTo(22) + $0.top.equalTo(findIDButton.snp.bottom).offset(28) + $0.trailing.equalToSuperview().inset(50) + } + + clearIDButton.snp.makeConstraints{ + $0.size.equalTo(20) + $0.trailing.equalTo(passwordTextField.snp.trailing).offset(-14) + $0.centerY.equalTo(idTextField.snp.centerY) + } + + + clearPWButton.snp.makeConstraints{ + $0.size.equalTo(20) + $0.trailing.equalTo(passwordTextField).offset(-56) + $0.centerY.equalTo(passwordTextField.snp.centerY) + } + + securityButton.snp.makeConstraints{ + $0.size.equalTo(20) + $0.trailing.equalTo(passwordTextField).inset(20) + $0.centerY.equalTo(passwordTextField) + } + + + } +} diff --git a/GO-SOPT-TVING/GO-SOPT-TVING/LoginViewController.swift b/GO-SOPT-TVING/GO-SOPT-TVING/LoginViewController.swift new file mode 100644 index 0000000..120b61f --- /dev/null +++ b/GO-SOPT-TVING/GO-SOPT-TVING/LoginViewController.swift @@ -0,0 +1,108 @@ +// +// LoginViewController.swift +// GO-SOPT-TVING +// +// Created by 김사랑 on 2023/04/21. +// + +import UIKit + +import SnapKit +import Then + +class LoginViewController: UIViewController { + + private lazy var loginView = LoginView() + + override func viewDidLoad() { + super.viewDidLoad() + configureUI() + setLayout() + setReact() + // Do any additional setup after loading the view. + } + + func configureUI() { + view.addSubview(loginView) + } + + func setLayout() { + loginView.snp.makeConstraints{ + $0.edges.equalToSuperview() + } + } + + func setReact() { + loginView.idTextField.delegate = self + loginView.passwordTextField.delegate = self + loginView.loginButton.addTarget(self, action: #selector(tappedLogInButton), for: .touchUpInside) + loginView.clearIDButton.addTarget(self, action: #selector(tappedClearIDButton), for: .touchUpInside) + loginView.clearPWButton.addTarget(self, action: #selector(tappedClearPWButton), for: .touchUpInside) + loginView.securityButton.addTarget(self, action: #selector(tappedSecurityButton), for: .touchUpInside) + } + + func hideButton() { + loginView.clearIDButton.isHidden = true + loginView.clearPWButton.isHidden = true + loginView.securityButton.isHidden = true + } + + func showButton() { + loginView.clearIDButton.isHidden = true + loginView.clearPWButton.isHidden = false + loginView.securityButton.isHidden = false + } + + @objc + func tappedLogInButton() { + let welcomeVC = WelcomeViewController() + welcomeVC.userName(name: loginView.idTextField.text ?? "") + navigationController?.pushViewController(welcomeVC, animated: true) + } + + @objc + func tappedClearIDButton() { + loginView.idTextField.text = "" + hideButton() + } + + @objc + func tappedClearPWButton() { + loginView.passwordTextField.text = "" + hideButton() + } + + @objc + func tappedSecurityButton() { + loginView.passwordTextField.isSecureTextEntry = !loginView.passwordTextField.isSecureTextEntry + } + +} + +extension LoginViewController: UITextFieldDelegate { + + func textFieldShouldReturn(_ textField: UITextField) -> Bool { + if textField == loginView.idTextField { + loginView.passwordTextField.becomeFirstResponder() + } else if textField == loginView.passwordTextField { + textField.resignFirstResponder() + tappedLogInButton() + } + return true + } + + func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { + let idText = loginView.idTextField.text ?? "" + let passwordText = loginView.passwordTextField.text ?? "" + if idText.count > 0 && passwordText.count > 0 { + loginView.loginButton.isEnabled = true + loginView.loginButton.backgroundColor = .mainRed + loginView.loginButton.setTitleColor(.white, for: .normal) + } else { + loginView.loginButton.isEnabled = false + loginView.loginButton.backgroundColor = .black + } + return true + } + +} diff --git a/GO-SOPT-TVING/GO-SOPT-TVING/SceneDelegate.swift b/GO-SOPT-TVING/GO-SOPT-TVING/SceneDelegate.swift new file mode 100644 index 0000000..d3c6c9e --- /dev/null +++ b/GO-SOPT-TVING/GO-SOPT-TVING/SceneDelegate.swift @@ -0,0 +1,25 @@ +// +// SceneDelegate.swift +// GO-SOPT-TVING +// +// Created by 김사랑 on 2023/04/20. +// +import UIKit + +import Inject + +class SceneDelegate: UIResponder, UIWindowSceneDelegate { + + var window: UIWindow? + + func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) { + + + guard let windowScene = (scene as? UIWindowScene) else { return } + + let injectViewController = Inject.ViewControllerHost(LoginViewController()) + self.window = UIWindow(windowScene: windowScene) + self.window?.rootViewController = injectViewController + self.window?.makeKeyAndVisible() + } +} diff --git a/GO-SOPT-TVING/GO-SOPT-TVING/ViewController.swift b/GO-SOPT-TVING/GO-SOPT-TVING/ViewController.swift new file mode 100644 index 0000000..1bb03b8 --- /dev/null +++ b/GO-SOPT-TVING/GO-SOPT-TVING/ViewController.swift @@ -0,0 +1,20 @@ +// +// ViewController.swift +// GO-SOPT-TVING +// +// Created by 김사랑 on 2023/04/20. +// + +import UIKit + + +class ViewController: UIViewController { + + override func viewDidLoad() { + super.viewDidLoad() + // Do any additional setup after loading the view. + } + + +} + diff --git a/GO-SOPT-TVING/GO-SOPT-TVING/WelcomeViewController.swift b/GO-SOPT-TVING/GO-SOPT-TVING/WelcomeViewController.swift new file mode 100644 index 0000000..b917fb5 --- /dev/null +++ b/GO-SOPT-TVING/GO-SOPT-TVING/WelcomeViewController.swift @@ -0,0 +1,87 @@ +// +// WelcomeViewController.swift +// GO-SOPT-TVING +// +// Created by 김사랑 on 2023/04/21. +// + +import UIKit + +class WelcomeViewController: UIViewController { + + private var user: String? + + func userName(name: String){ + user = name + } + + private let mainImageView = UIImageView().then { + $0.image = UIImage(named: "tving-logo") + $0.contentMode = .scaleAspectFill + } + + public let welcomeLabel = UILabel().then { + $0.text = "님\n반가워요!" + $0.font = .tvingBold(ofSize: 23) + $0.textColor = .white + $0.textAlignment = .center + $0.numberOfLines = 2 + } + + public lazy var gotoMainButton = UIButton().then { + $0.setTitle("메인으로", for: .normal) + $0.titleLabel?.font = .tvingSemiBold(ofSize: 14) + $0.titleLabel?.textAlignment = .center + $0.backgroundColor = .mainRed + $0.layer.cornerRadius = 3 + } + + override func viewDidLoad() { + super.viewDidLoad() + style() + setLayout() + setNavigationBar() + dataBind() + } + + func dataBind() { + guard let id = self.user else { return } + welcomeLabel.text = "\(id)님\n반가워요!" + } + + func style(){ + view.backgroundColor = .black + view.addSubviews(mainImageView, + welcomeLabel, + gotoMainButton) + } + + func setLayout(){ + mainImageView.snp.makeConstraints { + $0.height.equalTo(210.94) + $0.top.equalToSuperview().offset(58) + $0.leading.trailing.equalToSuperview() + } + welcomeLabel.snp.makeConstraints { + $0.height.equalTo(74) + $0.top.equalTo(mainImageView.snp.bottom).offset(67.06) + $0.leading.equalToSuperview().offset(75) + $0.centerX.equalToSuperview() + } + gotoMainButton.snp.makeConstraints { + $0.height.equalTo(52) + $0.top.equalTo(welcomeLabel.snp.bottom).offset(284) + $0.leading.trailing.equalToSuperview().inset(20) + } + gotoMainButton.addTarget(self, action: #selector(gotoMainButtonPressed), for: .touchUpInside) + } + + func setNavigationBar(){ + navigationController?.isNavigationBarHidden = true + } + + @objc private func gotoMainButtonPressed() { + let LoginView = LoginViewController() + navigationController?.pushViewController(LoginView, animated: true) + } +}